diff --git a/gradle.properties b/gradle.properties index b4053020..b7511886 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,8 +2,8 @@ group=com.kamesuta.mc modid=signpic modname=SignPicture version_major=2 -version_minor=2 -version_micro=2 +version_minor=3 +version_micro=0 version_minecraft=1.10.2 version_forge=12.18.1.2011 version_minforge=12.18.1.2011 diff --git a/info/info.json b/info/info.json index 7b02409f..57619602 100644 --- a/info/info.json +++ b/info/info.json @@ -1,27 +1,36 @@ { "versions": { "1.7.10": { + "version": "2.3.0", + "remote": "https://github.com/Team-Fruit/SignPicture/releases/download/1.7.10-2.3.0/SignPicture-1.7.10-2.3.0-universal.jar", + "local": "SignPicture-1.7.10-2.3.0-universal.jar", + "message": "Config & Prevent Anti-AutoSign Mode added. SignPicture 2.3.0 Released.", + "message_local": { + "ja_JP": "Anti-AutoSign回避モードとコンフィグの追加 SignPicture 2.3.0 リリース!" + } + }, + "1.8.9": { "version": "2.2.2", - "remote": "https://github.com/Team-Fruit/SignPicture/releases/download/1.7.10-2.2.2/SignPicture-1.7.10-2.2.2-universal.jar", - "local": "SignPicture-1.7.10-2.2.2-universal.jar", + "remote": "https://github.com/Team-Fruit/SignPicture/releases/download/1.8.9-2.2.2/SignPicture-1.8.9-2.2.2-universal.jar", + "local": "SignPicture-1.8.9-2.2.2-universal.jar", "message": "Offset And Rotations! More freely images! SignPicture 2.2.2 Released!", "message_local": { "ja_JP": "オフセットと回転機能実装! さらに自由自在に画像を貼ろう! SignPicture 2.2.2 リリース!" } }, - "1.8": { + "1.9.4": { "version": "2.1.5", - "remote": "https://github.com/Team-Fruit/SignPicture/releases/download/1.8-2.1.5/SignPicture-1.8-2.1.5-universal.jar", - "local": "SignPicture-1.8-2.1.5-universal.jar", + "remote": "https://github.com/Team-Fruit/SignPicture/releases/download/1.9.4-2.1.5/SignPicture-1.9.4-2.1.5-universal.jar", + "local": "SignPicture-1.9.4-2.1.5-universal.jar", "message": "GUI Update! SignPicture 2.1.5 Released!", "message_local": { "ja_JP": "遂にSignPictureにGUIが! SignPicture 2.1.5リリース!!" } }, - "1.9": { + "1.10.2": { "version": "2.1.5", - "remote": "https://github.com/Team-Fruit/SignPicture/releases/download/1.9-2.1.5/SignPicture-1.9-2.1.5-universal.jar", - "local": "SignPicture-1.9-2.1.5-universal.jar", + "remote": "https://github.com/Team-Fruit/SignPicture/releases/download/1.10.2-2.1.5/SignPicture-1.10.2-2.1.5-universal.jar", + "local": "SignPicture-1.10.2-2.1.5-universal.jar", "message": "GUI Update! SignPicture 2.1.5 Released!", "message_local": { "ja_JP": "遂にSignPictureにGUIが! SignPicture 2.1.5リリース!!" diff --git a/src/main/java/com/kamesuta/mc/bnnwidget/WGui.java b/src/main/java/com/kamesuta/mc/bnnwidget/WGui.java index 816994b6..12054d2c 100644 --- a/src/main/java/com/kamesuta/mc/bnnwidget/WGui.java +++ b/src/main/java/com/kamesuta/mc/bnnwidget/WGui.java @@ -115,6 +115,17 @@ public static void drawCenteredString(final String text, final float x, final fl GlStateManager.popMatrix(); } + /** + * Renders the specified text to the screen. + */ + public static void drawStringWithShadow(final String text, final float x, final float y, final int color) + { + GlStateManager.pushMatrix(); + GlStateManager.translate(x, y, 0f); + font().drawStringWithShadow(text, 0, 0, color); + GlStateManager.popMatrix(); + } + /** * Renders the specified text to the screen. */ @@ -237,7 +248,7 @@ public static void drawCenteredString(final String text, final Area a, final int */ public static void drawString(final String text, final Area a, final int color) { - drawString(text, a.x1(), a.y1(), color); + drawStringWithShadow(text, a.x1(), a.y1(), color); } /** @@ -277,38 +288,34 @@ public static void translate(final Area p) { GlStateManager.translate(p.x1(), p.y1(), 0f); } - public static void drawString(final String text, final int x, final int y, final int colour, final boolean shadow) { + public static void drawString(final String text, final float x, final float y, final int colour, final boolean shadow) { if (shadow) - font().drawStringWithShadow(text, x, y, colour); + drawStringWithShadow(text, x, y, colour); else - font().drawString(text, x, y, colour); - } - - public static void drawString(final String text, final int x, final int y, final int colour) { - drawString(text, x, y, colour, true); + drawString(text, x, y, colour); } - public static void drawStringC(final String text, final int x, final int y, final int w, final int h, final int colour, final boolean shadow) { + public static void drawStringC(final String text, final float x, final float y, final float w, final float h, final int colour, final boolean shadow) { drawString(text, x + (w - getStringWidth(text)) / 2, y + (h - 8) / 2, colour, shadow); } - public static void drawStringC(final String text, final int x, final int y, final int w, final int h, final int colour) { + public static void drawStringC(final String text, final float x, final float y, final float w, final float h, final int colour) { drawStringC(text, x, y, w, h, colour, true); } - public static void drawStringC(final String text, final int x, final int y, final int colour, final boolean shadow) { + public static void drawStringC(final String text, final float x, final float y, final int colour, final boolean shadow) { drawString(text, x - getStringWidth(text) / 2, y, colour, shadow); } - public static void drawStringC(final String text, final int x, final int y, final int colour) { - drawStringC(text, x, y, colour, true); + public static void drawStringC(final String text, final float f, final float g, final int colour) { + drawStringC(text, f, g, colour, true); } - public static void drawStringR(final String text, final int x, final int y, final int colour, final boolean shadow) { + public static void drawStringR(final String text, final float x, final float y, final int colour, final boolean shadow) { drawString(text, x - getStringWidth(text), y, colour, shadow); } - public static void drawStringR(final String text, final int x, final int y, final int colour) { + public static void drawStringR(final String text, final float x, final float y, final int colour) { drawStringR(text, x, y, colour, true); } diff --git a/src/main/java/com/kamesuta/mc/bnnwidget/WPanel.java b/src/main/java/com/kamesuta/mc/bnnwidget/WPanel.java index 745bb10e..4f3bbf1c 100644 --- a/src/main/java/com/kamesuta/mc/bnnwidget/WPanel.java +++ b/src/main/java/com/kamesuta/mc/bnnwidget/WPanel.java @@ -124,9 +124,7 @@ public boolean onCloseRequest() { boolean closable = true; for (final Iterator itr = this.widgets.iterator(); itr.hasNext();) { final WCommon widget = itr.next(); - if (widget.onCloseRequest()) - itr.remove(); - else { + if (!widget.onCloseRequest()) { this.removelist.offer(widget); closable = false; } diff --git a/src/main/java/com/kamesuta/mc/bnnwidget/component/MLabel.java b/src/main/java/com/kamesuta/mc/bnnwidget/component/MLabel.java index 632371a1..09f7f72e 100644 --- a/src/main/java/com/kamesuta/mc/bnnwidget/component/MLabel.java +++ b/src/main/java/com/kamesuta/mc/bnnwidget/component/MLabel.java @@ -19,15 +19,15 @@ public MLabel(final R position, final String text) { } public void setText(final String s) { - if (StringUtils.equals(s, this.text)) { + if (StringUtils.equals(s, getText())) { return; } - final String oldText = this.text; + final String oldText = getText(); this.text = s; onTextChanged(oldText); } - public final String getText() { + public String getText() { return this.text; } @@ -42,6 +42,6 @@ public void draw(final WEvent ev, final Area pgp, final Point p, final float fra protected void drawText(final Area a) { RenderHelper.startTexture(); - drawString(this.text, a.x1(), a.y1() + (a.h()-font().FONT_HEIGHT) / 2, this.textcolor); + drawStringC(getText(), a.x1()+a.w()/2, a.y1() + (a.h()-font().FONT_HEIGHT) / 2, this.textcolor); } } diff --git a/src/main/java/com/kamesuta/mc/bnnwidget/component/MTextField.java b/src/main/java/com/kamesuta/mc/bnnwidget/component/MTextField.java deleted file mode 100644 index 31328ef9..00000000 --- a/src/main/java/com/kamesuta/mc/bnnwidget/component/MTextField.java +++ /dev/null @@ -1,288 +0,0 @@ -package com.kamesuta.mc.bnnwidget.component; - -import java.util.ArrayDeque; -import java.util.Deque; - -import org.apache.commons.lang3.StringUtils; -import org.lwjgl.input.Keyboard; - -import com.kamesuta.mc.bnnwidget.WBase; -import com.kamesuta.mc.bnnwidget.WEvent; -import com.kamesuta.mc.bnnwidget.position.Area; -import com.kamesuta.mc.bnnwidget.position.Point; -import com.kamesuta.mc.bnnwidget.position.R; -import com.kamesuta.mc.signpic.render.RenderHelper; - -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.util.ChatAllowedCharacters; - -@Deprecated -public class MTextField extends WBase { - protected String text = ""; - public String watermark; - protected int seek; - protected boolean isFocused; - protected boolean isEnabled; - public int maxStringLength; - public int cursorCounter; - public String actionCommand; - protected String allowedCharacters; - - protected Deque back = new ArrayDeque(); - protected Deque next = new ArrayDeque(); - - - public void setWatermark(final String watermark) { - this.watermark = watermark; - } - - public String getWatermark() { - return this.watermark; - } - - protected void log(final String s) { - if (!StringUtils.equals(s, this.back.peek())) { - final String t = this.next.poll(); - if (t!=null) - this.back.push(t); - this.next.clear(); - this.next.push(s); - } - //Reference.logger.info("log" + this.back + ":" + this.next); - } - - protected void next() { - if (!this.next.isEmpty()) { - final String s = getText(); - final String b = this.next.poll(); - this.back.push(s); - setTextRaw(b); - } - //Reference.logger.info("next" + this.back + ":" + this.next); - } - - protected void back() { - if (!this.back.isEmpty()) { - final String s = getText(); - final String b = this.back.poll(); - this.next.push(s); - setTextRaw(b); - } - //Reference.logger.info("back" + this.back + ":" + this.next); - } - - public MTextField(final R position) { - super(position); - this.isFocused = false; - this.isEnabled = true; - } - - public MTextField(final R position, final String watermark) { - this(position); - this.watermark = watermark; - } - - public boolean setText(final String s) { - if (setTextRaw(s)) { - log(s); - return true; - } - return false; - } - - public boolean setTextRaw(final String s) { - if ((s.length() <= this.maxStringLength) || (this.maxStringLength <= 0)) { - if (StringUtils.equals(s, getText())) { - return false; - } - final String oldText = getText(); - this.text = s; - onTextChanged(oldText); - return true; - } - return false; - } - - public final String getText() { - return this.text; - } - - protected void onTextChanged(final String oldText) { - } - - public final boolean isEnabled() { - return this.isEnabled; - } - - public void setEnabled(final boolean b) { - this.isEnabled = b; - if ((!this.isEnabled) && (this.isFocused)) { - setFocused(false); - } - } - - public final boolean isFocused() { - return this.isFocused; - } - - @Override - public void update(final WEvent ev, final Area pgp, final Point p) { - this.cursorCounter += 1; - } - - @Override - public void keyTyped(final WEvent ev, final Area pgp, final Point p, final char c, final int keycode) { - if ((!isEnabled()) || (!isFocused())) { - return; - } else if (keycode == Keyboard.KEY_LCONTROL || keycode == Keyboard.KEY_RCONTROL) { - return; - } else if (c == '\026') { - final String s = GuiScreen.getClipboardString(); - if (StringUtils.isEmpty(s)) { - return; - } - final StringBuilder stb = new StringBuilder(getText()); - int j = 0; - for (int i = 0; i < s.length(); i++) { - if ((getText().length() >= this.maxStringLength) && (this.maxStringLength > 0)) { - return; - } - final char tc = s.charAt(i); - if (canAddChar(tc)) { - stb.append(tc); - j++; - } - } - setText(stb.toString()); - this.seek += j; - } else if (c == '\031') { - next(); - } else if (c == '\032') { - back(); - } else if (keycode == Keyboard.KEY_BACK) { - final String s = getText(); - final int seek = getSeek(); - if (seek > 0) { - setText(s.substring(0, seek-1) + s.substring(seek, s.length())); - this.seek--; - } - } else if (keycode == Keyboard.KEY_DELETE) { - final String s = getText(); - final int seek = getSeek(); - if (seek < s.length()) - setText(s.substring(0, seek) + s.substring(seek+1, s.length())); - } else if (keycode == Keyboard.KEY_LEFT) { - this.seek--; - } else if (keycode == Keyboard.KEY_RIGHT) { - this.seek++; - } else if (keycode == Keyboard.KEY_HOME) { - this.seek = 0; - } else if (keycode == Keyboard.KEY_END) { - this.seek = getText().length(); - } else if (keycode == Keyboard.KEY_RETURN) { - setFocused(false); - } else if (((getText().length() < this.maxStringLength) || (this.maxStringLength == 0)) && (canAddChar(c))) { - final String s = getText(); - final int seek = getSeek(); - setText(s.substring(0, seek) + c + s.substring(seek, s.length())); - this.seek++; - } - } - - protected int getSeek() { - return this.seek = Math.min(getText().length(), Math.max(0, this.seek)); - } - - public boolean canAddChar(final char c) { - if (this.allowedCharacters == null) - return ChatAllowedCharacters.isAllowedCharacter(c); - else if (StringUtils.isEmpty(this.allowedCharacters)) - return true; - else - return this.allowedCharacters.indexOf(c) >= 0; - } - - @Override - public void mouseClicked(final WEvent ev, final Area pgp, final Point p, final int button) { - final Area gp = pgp.child(this.position); - if (gp.pointInside(p)) { - setFocused(true); - if (button == 1) { - setText(""); - } - final Area in = getGuiPosition(pgp).child(1, 1, -1, -1); - this.seek = font().trimStringToWidth(getText(), (int) (p.x() - (in.x1() + 4))).length(); - } else { - setFocused(false); - } - } - - public void setFocused(final boolean focus) { - if (focus == isFocused()) { - return; - } - this.isFocused = focus; - onFocusChanged(); - } - - public void onFocusChanged() { - if (isFocused()) { - this.cursorCounter = 0; - } - } - - @Override - public void draw(final WEvent ev, final Area pgp, final Point p, final float frame) { - final Area out = getGuiPosition(pgp); - final Area in = getGuiPosition(pgp).child(1, 1, -1, -1); - drawBackground(out, in); - drawWatermark(in); - drawText(in); - drawCursor(in); - } - - protected void drawBackground(final Area out, final Area in) { - RenderHelper.startShape(); - GlStateManager.color(0.627451f, 0.627451f, 0.627451f, 1f); - drawRect(out); - GlStateManager.color(0f, 0f, 0f, 1f); - drawRect(in); - } - - protected void drawWatermark(final Area a) { - RenderHelper.startTexture(); - if (!StringUtils.isEmpty(this.watermark)&& StringUtils.isEmpty(getText()) && !isFocused()) - drawString(this.watermark, a.x1() + 4, a.y1() + a.h() / 2 - 4, 0x777777); - } - - protected void drawText(final Area a) { - RenderHelper.startTexture(); - drawString(getText(), a.x1() + 4, a.y1() + a.h() / 2 - 4, getTextColour()); - } - - protected void drawCursor(final Area a) { - RenderHelper.startTexture(); - final String s = getText(); - final int seek = getSeek(); - final boolean blink = this.cursorCounter / 6 % 2 == 0; - if ((isEnabled()) && (isFocused())) { - if (blink) - drawCenteredString("\u2503", a.x1() + 4 + font().getStringWidth(s.substring(0, seek)), a.y1() + a.h() / 2 - 4, getTextColour()); - } - } - - public int getTextColour() { - return isEnabled() ? 14737632 : 7368816; - } - - public MTextField setMaxStringLength(final int i) { - this.maxStringLength = i; - return this; - } - - public MTextField setAllowedCharacters(final String s) { - this.allowedCharacters = s; - return this; - } -} diff --git a/src/main/java/com/kamesuta/mc/signpic/Client.java b/src/main/java/com/kamesuta/mc/signpic/Client.java index be019f88..1f59bb70 100644 --- a/src/main/java/com/kamesuta/mc/signpic/Client.java +++ b/src/main/java/com/kamesuta/mc/signpic/Client.java @@ -29,8 +29,6 @@ public class Client { public static File mcDir; public static File signpicDir; public static File signpicCacheDir; - public static File configDir; - public static File configFile; public static File modDir; public static File modFile; diff --git a/src/main/java/com/kamesuta/mc/signpic/Config.java b/src/main/java/com/kamesuta/mc/signpic/Config.java index 345c6a97..400e92f7 100644 --- a/src/main/java/com/kamesuta/mc/signpic/Config.java +++ b/src/main/java/com/kamesuta/mc/signpic/Config.java @@ -1,7 +1,126 @@ package com.kamesuta.mc.signpic; -// TODO -public class Config { - public Config() { +import java.io.File; + +import org.apache.commons.lang3.StringUtils; + +import com.kamesuta.mc.signpic.handler.CoreEvent; + +import net.minecraftforge.common.config.Configuration; +import net.minecraftforge.common.config.Property; +import net.minecraftforge.fml.client.event.ConfigChangedEvent; + +public final class Config extends Configuration { + public static Config instance; + + private final File configFile; + public boolean updatable; + + public int imageWidthLimit = 512; + public int imageHeightLimit = 512; + public boolean imageAnimationGif = true; + + public int entryGCtick = 15; + + public int contentLoadThreads = 3; + public int contentMaxByte = 0; + public int contentGCtick = 15 * 20; + public int contentAsyncTick = 0; + public int contentSyncTick = 0; + + public boolean informationNotice = true; + public boolean informationJoinBeta = false; + + public boolean multiplayPAAS = true; + /** Fastest time "possible" estimate for an empty sign. */ + public int multiplayPAASMinEditTime = 150; + /** Minimum time needed to add one extra line (not the first). */ + public int multiplayPAASMinLineTime = 50; + /** Minimum time needed to type a character. */ + public int multiplayPAASMinCharTime = 50; + + public float renderSeeOpacity = .5f; + public float renderPreviewFixedOpacity = .7f; + public float renderPreviewFloatedOpacity = .7f; + + public Config( final File configFile ) { + super( configFile ); + this.configFile = configFile; + + this.imageWidthLimit = get( "Image", "WidthLimit", this.imageWidthLimit ).setRequiresMcRestart(true).getInt( this.imageWidthLimit ); + this.imageHeightLimit = get( "Image", "HeightLimit", this.imageHeightLimit ).setRequiresMcRestart(true).getInt( this.imageHeightLimit ); + this.imageAnimationGif = get( "Image", "AnimateGif", this.imageAnimationGif ).setRequiresMcRestart(true).getBoolean( this.imageAnimationGif ); + + addCustomCategoryComment("Entry", "Entry(sign text parse cache) Management"); + + addCustomCategoryComment("Content", "Content Data Management"); + + this.informationNotice = get( "Version", "Notice", this.informationNotice ).setRequiresMcRestart(true).getBoolean( this.informationNotice ); + + final Property joinBeta = get( "Version", "JoinBeta", this.informationJoinBeta ); + final String[] v = StringUtils.split(Reference.VERSION, "\\."); + if (v.length>=4 &&StringUtils.equals(v[3], "beta")) { + this.informationJoinBeta = true; + joinBeta.set(true); + } + this.informationJoinBeta = joinBeta.setRequiresMcRestart(true).getBoolean( this.informationJoinBeta ); + + addCustomCategoryComment("MultiplayPreventAntiAutoSign", "Prevent from Anti-AutoSign Plugin such as NoCheatPlus. (ms)"); + + changeableSync(); + + this.updatable = true; + } + + private void changeableSync() { + this.entryGCtick = get( "Entry", "GCDelayTick", this.entryGCtick ).getInt( this.entryGCtick ); + + this.contentLoadThreads = addComment(get( "Content", "LoadThreads", this.contentLoadThreads ), "parallel processing number such as Downloading").setRequiresMcRestart(true).getInt( this.contentLoadThreads ); + this.contentMaxByte = addComment(get( "Content", "MaxByte", this.contentMaxByte ), "limit of size before downloading").getInt( this.contentMaxByte ); + this.contentGCtick = addComment(get( "Content", "GCDelayTick", this.contentGCtick ), "delay ticks of Garbage Collection").getInt( this.contentGCtick ); + this.contentAsyncTick = addComment(get( "Content", "AsyncLoadDelayTick", this.contentAsyncTick ), "ticks of Async process starting delay (Is other threads, it does not disturb the operation) such as Downloading, File Loading...").getInt( this.contentAsyncTick ); + this.contentSyncTick = addComment(get( "Content", "SyncLoadIntervalTick", this.contentSyncTick ), "ticks of Sync process interval (A drawing thread, affects the behavior. Please increase the value if the operation is heavy.) such as Gl Texture Uploading").getInt( this.contentSyncTick ); + + this.multiplayPAAS = get( "MultiplayPreventAntiAutoSign", "Enable", this.multiplayPAAS ).getBoolean( this.multiplayPAAS ); + this.multiplayPAASMinEditTime = get( "MultiplayPreventAntiAutoSign", "minEditTime", this.multiplayPAASMinEditTime ).getInt( this.multiplayPAASMinEditTime ); + this.multiplayPAASMinLineTime = get( "MultiplayPreventAntiAutoSign", "minLineTime", this.multiplayPAASMinLineTime ).getInt( this.multiplayPAASMinLineTime ); + this.multiplayPAASMinCharTime = get( "MultiplayPreventAntiAutoSign", "minCharTime", this.multiplayPAASMinCharTime ).getInt( this.multiplayPAASMinCharTime ); + + this.renderSeeOpacity = (float) get( "Render", "ViewSignOpacity", this.renderSeeOpacity ).getDouble( this.renderSeeOpacity ); + this.renderPreviewFixedOpacity = (float) get( "Render", "PreviewFixedSignOpacity", this.renderPreviewFixedOpacity ).getDouble( this.renderPreviewFixedOpacity ); + this.renderPreviewFloatedOpacity = (float) get( "Render", "PreviewFloatedSignOpacity", this.renderPreviewFloatedOpacity ).getDouble( this.renderPreviewFloatedOpacity ); + } + + private Property addComment(final Property prop, final String comment) { + prop.setComment(comment); + return prop; + } + + @Override + public void save() + { + if( hasChanged() ) + { + super.save(); + } + } + + @CoreEvent + public void onConfigChanged( final ConfigChangedEvent.OnConfigChangedEvent eventArgs ) + { + if( StringUtils.equals(eventArgs.getModID(), Reference.MODID) ) + { + changeableSync(); + + if( this.updatable ) + { + save(); + } + } + } + + public String getFilePath() + { + return this.configFile.getPath(); } -} +} \ No newline at end of file diff --git a/src/main/java/com/kamesuta/mc/signpic/Reference.java b/src/main/java/com/kamesuta/mc/signpic/Reference.java index 0ed99e47..bbd7e342 100644 --- a/src/main/java/com/kamesuta/mc/signpic/Reference.java +++ b/src/main/java/com/kamesuta/mc/signpic/Reference.java @@ -11,6 +11,7 @@ public class Reference { public static final String MINECRAFT = "${mcversion}"; public static final String PROXY_SERVER = "com.kamesuta.mc.signpic.proxy.CommonProxy"; public static final String PROXY_CLIENT = "com.kamesuta.mc.signpic.proxy.ClientProxy"; + public static final String GUI_FACTORY = "com.kamesuta.mc.signpic.gui.config.ConfigGuiFactory"; public static Logger logger = LogManager.getLogger(Reference.MODID); } diff --git a/src/main/java/com/kamesuta/mc/signpic/SignPicture.java b/src/main/java/com/kamesuta/mc/signpic/SignPicture.java index 39e35ea5..2f80cea0 100644 --- a/src/main/java/com/kamesuta/mc/signpic/SignPicture.java +++ b/src/main/java/com/kamesuta/mc/signpic/SignPicture.java @@ -14,7 +14,7 @@ import net.minecraftforge.fml.common.network.NetworkCheckHandler; import net.minecraftforge.fml.relauncher.Side; -@Mod(modid = Reference.MODID, name = Reference.NAME, version = Reference.VERSION) +@Mod(modid = Reference.MODID, name = Reference.NAME, version = Reference.VERSION, guiFactory = Reference.GUI_FACTORY) public class SignPicture { @Instance(Reference.MODID) public static SignPicture instance; @@ -29,6 +29,7 @@ public boolean checkModList(final Map versions, final Side side) @EventHandler public void preInit(final FMLPreInitializationEvent event) { + Config.instance = new Config(event.getSuggestedConfigurationFile()); proxy.preInit(event); } @@ -40,5 +41,6 @@ public void init(final FMLInitializationEvent event) { @EventHandler public void postInit(final FMLPostInitializationEvent event) { proxy.postInit(event); + Config.instance.save(); } } diff --git a/src/main/java/com/kamesuta/mc/signpic/entry/EntryId.java b/src/main/java/com/kamesuta/mc/signpic/entry/EntryId.java index 317217c8..e8212ef3 100644 --- a/src/main/java/com/kamesuta/mc/signpic/entry/EntryId.java +++ b/src/main/java/com/kamesuta/mc/signpic/entry/EntryId.java @@ -76,7 +76,13 @@ public boolean hasContentId() { } public boolean hasMeta() { - return StringUtils.endsWith(this.id, "]") && StringUtils.contains(this.id, "["); + return (StringUtils.endsWith(this.id, "]") && StringUtils.contains(this.id, "[")) || + (hasPrefix() && StringUtils.endsWith(this.id, "}") && StringUtils.contains(this.id, "{")); + } + + public boolean hasPrefix() { + final int i = StringUtils.indexOf(this.id, "#"); + return 0 <= i && i < 2; } public boolean isValid() { @@ -88,6 +94,8 @@ public ContentId getContentId() { String id; if (StringUtils.contains(this.id, "[")) id = StringUtils.substring(this.id, 0, StringUtils.lastIndexOf(this.id, "[")); + else if (hasPrefix() && StringUtils.contains(this.id, "{")) + id = StringUtils.substring(this.id, StringUtils.indexOf(this.id, "#")+1, StringUtils.lastIndexOf(this.id, "{")); else id = this.id; return new ContentId(id); @@ -97,7 +105,10 @@ public ContentId getContentId() { public ImageMeta getMeta() { if (hasMeta()) - return new ImageMeta().parse(StringUtils.substring(this.id, StringUtils.lastIndexOf(this.id, "[")+1, StringUtils.length(this.id)-1)); + if (StringUtils.endsWith(this.id, "}")) + return new ImageMeta().parse(StringUtils.substring(this.id, StringUtils.lastIndexOf(this.id, "{")+1, StringUtils.length(this.id)-1)); + else + return new ImageMeta().parse(StringUtils.substring(this.id, StringUtils.lastIndexOf(this.id, "[")+1, StringUtils.length(this.id)-1)); else return null; } @@ -118,6 +129,10 @@ public void toChats(final ITextComponent[] sign) { sign[i] = new TextComponentString(StringUtils.substring(this.id, 15*i, Math.min(15*(i+1), length))); } + public int getLastLine() { + return StringUtils.length(this.id)/15; + } + public void toEntity(final TileEntitySign tile) { toChats(tile.signText); } diff --git a/src/main/java/com/kamesuta/mc/signpic/entry/EntryManager.java b/src/main/java/com/kamesuta/mc/signpic/entry/EntryManager.java index f7f49e2d..3fb3a255 100644 --- a/src/main/java/com/kamesuta/mc/signpic/entry/EntryManager.java +++ b/src/main/java/com/kamesuta/mc/signpic/entry/EntryManager.java @@ -2,8 +2,6 @@ import java.util.Iterator; import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import com.google.common.collect.Maps; import com.kamesuta.mc.signpic.handler.CoreEvent; @@ -11,10 +9,9 @@ public class EntryManager implements ITickEntry { public static final EntryManager instance = new EntryManager(); - public final ExecutorService threadpool = Executors.newFixedThreadPool(3); private final Map> registry = Maps.newHashMap(); - public Entry get(final EntryId id) { + protected Entry get(final EntryId id) { final EntrySlot entries = this.registry.get(id); if (entries!=null) return entries.get(); diff --git a/src/main/java/com/kamesuta/mc/signpic/entry/EntrySlot.java b/src/main/java/com/kamesuta/mc/signpic/entry/EntrySlot.java index 545fdc61..be3e22af 100644 --- a/src/main/java/com/kamesuta/mc/signpic/entry/EntrySlot.java +++ b/src/main/java/com/kamesuta/mc/signpic/entry/EntrySlot.java @@ -1,7 +1,8 @@ package com.kamesuta.mc.signpic.entry; +import com.kamesuta.mc.signpic.Config; + public class EntrySlot { - public static final int CollectTimes = 20 * 15; protected static long times = 0; protected final T entry; @@ -23,10 +24,14 @@ public EntrySlot used() { } public boolean shouldCollect() { - return times - this.time > CollectTimes; + return times - this.time > getCollectTimes(); } public static void Tick() { times++; } + + protected int getCollectTimes() { + return Config.instance.entryGCtick; + } } diff --git a/src/main/java/com/kamesuta/mc/signpic/entry/content/ContentCapacityOverException.java b/src/main/java/com/kamesuta/mc/signpic/entry/content/ContentCapacityOverException.java new file mode 100644 index 00000000..29e3be22 --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/entry/content/ContentCapacityOverException.java @@ -0,0 +1,20 @@ +package com.kamesuta.mc.signpic.entry.content; + +import java.io.IOException; + +public class ContentCapacityOverException extends IOException { + public ContentCapacityOverException() { + } + + public ContentCapacityOverException(final String message) { + super(message); + } + + public ContentCapacityOverException(final Throwable cause) { + super(cause); + } + + public ContentCapacityOverException(final String message, final Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/com/kamesuta/mc/signpic/entry/content/ContentDownloader.java b/src/main/java/com/kamesuta/mc/signpic/entry/content/ContentDownloader.java index fbf844f6..4284681b 100644 --- a/src/main/java/com/kamesuta/mc/signpic/entry/content/ContentDownloader.java +++ b/src/main/java/com/kamesuta/mc/signpic/entry/content/ContentDownloader.java @@ -14,6 +14,7 @@ import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpUriRequest; +import com.kamesuta.mc.signpic.Config; import com.kamesuta.mc.signpic.entry.IAsyncProcessable; import com.kamesuta.mc.signpic.util.Downloader; @@ -38,6 +39,11 @@ public void onAsyncProcess() throws URISyntaxException, IllegalStateException, I final HttpResponse response = Downloader.downloader.client.execute(req); final HttpEntity entity = response.getEntity(); + final long max = Config.instance.contentMaxByte; + final long size = entity.getContentLength(); + if (max > 0 && (size < 0 || size > max)) + throw new ContentCapacityOverException(); + this.content.state.progress.overall = entity.getContentLength(); input = entity.getContent(); countoutput = new CountingOutputStream(new BufferedOutputStream(new FileOutputStream(local))) { diff --git a/src/main/java/com/kamesuta/mc/signpic/entry/content/ContentManager.java b/src/main/java/com/kamesuta/mc/signpic/entry/content/ContentManager.java index 15e73458..06f45c45 100644 --- a/src/main/java/com/kamesuta/mc/signpic/entry/content/ContentManager.java +++ b/src/main/java/com/kamesuta/mc/signpic/entry/content/ContentManager.java @@ -8,6 +8,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import com.kamesuta.mc.signpic.Config; import com.kamesuta.mc.signpic.entry.IAsyncProcessable; import com.kamesuta.mc.signpic.entry.IDivisionProcessable; import com.kamesuta.mc.signpic.entry.ITickEntry; @@ -16,15 +17,17 @@ public class ContentManager implements ITickEntry { public static ContentManager instance = new ContentManager(); - public final ExecutorService threadpool = Executors.newFixedThreadPool(3); + public final ExecutorService threadpool = Executors.newFixedThreadPool(Config.instance.contentLoadThreads); protected final HashMap> registry = new HashMap>(); public Deque asyncqueue = new ArrayDeque(); public Deque divisionqueue = new ArrayDeque(); + private int asynctick = 0; + private int divisiontick = 0; - public ContentManager() { + private ContentManager() { } - public Content get(final ContentId id) { + protected Content get(final ContentId id) { final ContentSlot entries = this.registry.get(id); if (entries!=null) return entries.get(); @@ -38,28 +41,36 @@ public Content get(final ContentId id) { @CoreEvent @Override public void onTick() { - IAsyncProcessable asyncprocess; - if ((asyncprocess = this.asyncqueue.poll()) != null) { - final IAsyncProcessable asyncprocessexec = asyncprocess; - this.threadpool.execute(new Runnable() { - @Override - public void run() { - try { - asyncprocessexec.onAsyncProcess(); - } catch (final Exception e) { - e.printStackTrace(); + this.asynctick++; + if (this.asynctick > Config.instance.contentAsyncTick) { + this.asynctick = 0; + IAsyncProcessable asyncprocess; + if ((asyncprocess = this.asyncqueue.poll()) != null) { + final IAsyncProcessable asyncprocessexec = asyncprocess; + this.threadpool.execute(new Runnable() { + @Override + public void run() { + try { + asyncprocessexec.onAsyncProcess(); + } catch (final Exception e) { + e.printStackTrace(); + } } - } - }); + }); + } } - IDivisionProcessable divisionprocess; - if ((divisionprocess = this.divisionqueue.peek()) != null) { - try { - if (divisionprocess.onDivisionProcess()) { - this.divisionqueue.poll(); + this.divisiontick++; + if (this.divisiontick > Config.instance.contentAsyncTick) { + this.divisiontick = 0; + IDivisionProcessable divisionprocess; + if ((divisionprocess = this.divisionqueue.peek()) != null) { + try { + if (divisionprocess.onDivisionProcess()) { + this.divisionqueue.poll(); + } + } catch (final Exception e) { + e.printStackTrace(); } - } catch (final Exception e) { - e.printStackTrace(); } } diff --git a/src/main/java/com/kamesuta/mc/signpic/entry/content/ContentSlot.java b/src/main/java/com/kamesuta/mc/signpic/entry/content/ContentSlot.java index 17e64a74..edc45078 100644 --- a/src/main/java/com/kamesuta/mc/signpic/entry/content/ContentSlot.java +++ b/src/main/java/com/kamesuta/mc/signpic/entry/content/ContentSlot.java @@ -1,13 +1,11 @@ package com.kamesuta.mc.signpic.entry.content; +import com.kamesuta.mc.signpic.Config; import com.kamesuta.mc.signpic.entry.EntrySlot; import com.kamesuta.mc.signpic.entry.ICollectable; import com.kamesuta.mc.signpic.entry.IInitable; public class ContentSlot extends EntrySlot implements IInitable, ICollectable { - public static int CollectTimes = 20 * 15; - public static long times = 0; - private boolean init = true; public ContentSlot(final T entry) { @@ -28,4 +26,9 @@ public boolean shouldInit() { public void onCollect() { this.entry.onCollect(); } + + @Override + protected int getCollectTimes() { + return Config.instance.contentGCtick; + } } \ No newline at end of file diff --git a/src/main/java/com/kamesuta/mc/signpic/gui/GuiPAAS.java b/src/main/java/com/kamesuta/mc/signpic/gui/GuiPAAS.java new file mode 100644 index 00000000..dbcdf188 --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/gui/GuiPAAS.java @@ -0,0 +1,131 @@ +package com.kamesuta.mc.signpic.gui; + +import org.apache.commons.lang3.StringUtils; + +import com.kamesuta.mc.bnnwidget.WBase; +import com.kamesuta.mc.bnnwidget.WEvent; +import com.kamesuta.mc.bnnwidget.WFrame; +import com.kamesuta.mc.bnnwidget.WPanel; +import com.kamesuta.mc.bnnwidget.component.MLabel; +import com.kamesuta.mc.bnnwidget.motion.Easings; +import com.kamesuta.mc.bnnwidget.motion.MCoord; +import com.kamesuta.mc.bnnwidget.position.Area; +import com.kamesuta.mc.bnnwidget.position.Coord; +import com.kamesuta.mc.bnnwidget.position.Point; +import com.kamesuta.mc.bnnwidget.position.RArea; +import com.kamesuta.mc.signpic.Client; +import com.kamesuta.mc.signpic.entry.EntryId; +import com.kamesuta.mc.signpic.mode.CurrentMode; +import com.kamesuta.mc.signpic.render.RenderHelper; +import com.kamesuta.mc.signpic.util.Sign.SendPacketTask; + +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.resources.I18n; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntitySign; + +public class GuiPAAS extends WFrame { + private final SendPacketTask task; + private boolean preview; + + public GuiPAAS(final SendPacketTask task) { + this.task = task; + } + + @Override + protected void init() { + this.preview = CurrentMode.instance.isState(CurrentMode.State.PREVIEW); + CurrentMode.instance.setState(CurrentMode.State.PREVIEW, false); + + add(new WPanel(RArea.diff(0, 0, 0, 0)) { + private final int max = StringUtils.length(GuiPAAS.this.task.id.id()); + private int cursor; + private boolean close = true; + private int c; + + @Override + protected void initWidget() { + add(new WBase(RArea.diff(0, 0, 0, 0)) { + MCoord c = new MCoord(0f).add(Easings.easeLinear.move(.25f, .2f)).start(); + + @Override + public void draw(final WEvent ev, final Area pgp, final Point p, final float frame) { + RenderHelper.startShape(); + GlStateManager.color(0f, 0f, 0f, this.c.get()); + drawRect(getGuiPosition(pgp)); + } + }); + + final float f1 = 93.75F; + add(new WBase(new RArea(Coord.right(15), Coord.top(15), Coord.width(f1), Coord.height(f1))) { + @Override + public void draw(final WEvent ev, final Area pgp, final Point p, final float frame) { + final Area a = getGuiPosition(pgp); + + RenderHelper.startTexture(); + GlStateManager.color(1f, 1f, 1f, 1f); + GlStateManager.pushMatrix(); + GlStateManager.translate(a.x1()+a.w()/2, a.y1(), 50f); + GlStateManager.scale(-f1, -f1, -f1); + GlStateManager.rotate(180f, 0f, 1f, 0f); + Client.renderer.translateBase(GuiPAAS.this.task.entity, -0.5D, -0.75D, -0.5D, -1f); + Client.renderer.renderSignPictureBase(GuiPAAS.this.task.entity, -0.5D, -0.75D, -0.5D, 0.0F, -1, 1f); + GlStateManager.popMatrix(); + } + }); + + final int f = font().FONT_HEIGHT/2; + + add(new MLabel(new RArea(Coord.left(15), Coord.right(15), Coord.top(-f), Coord.bottom(+f)), "") { + @Override + public void update(final WEvent ev, final Area pgp, final Point p) { + setText(I18n.format("signpic.gui.paas.count", String.format("%d", c), String.format("%d", max))); + } + }); + + add(new MLabel(new RArea(Coord.left(15), Coord.right(15), Coord.top(+f), Coord.bottom(-f)), "") { + @Override + public void update(final WEvent ev, final Area pgp, final Point p) { + setText(I18n.format("signpic.gui.paas.time", String.format("%.1f", GuiPAAS.this.task.timer.getTime()), String.format("%.1f", GuiPAAS.this.task.limit / 1000f))); + } + }); + } + + @Override + public void update(final WEvent ev, final Area pgp, final Point p) { + if (this.close) { + if (!GuiPAAS.this.task.tick()) { + this.c = (int) (GuiPAAS.this.task.timer.getTime() * 1000 / GuiPAAS.this.task.limit * this.max); + if (this.cursor != this.c) { + final EntryId id = new EntryId(StringUtils.substring(GuiPAAS.this.task.id.id(), 0, this.c)); + final int last = id.getLastLine(); + id.toEntity(GuiPAAS.this.task.entity); + GuiPAAS.this.task.entity.lineBeingEdited = last; + final TileEntity e1 = Client.mc.theWorld.getTileEntity(GuiPAAS.this.task.entity.getPos()); + if (e1 instanceof TileEntitySign) { + final TileEntitySign tileSign = (TileEntitySign) e1; + id.toEntity(tileSign); + tileSign.lineBeingEdited = last; + } + } + this.cursor = this.c; + } else { + this.close = false; + requestClose(); + } + } + super.update(ev, pgp, p); + } + }); + } + + @Override + public boolean doesGuiPauseGame() { + return false; + } + + @Override + public void onGuiClosed() { + CurrentMode.instance.setState(CurrentMode.State.PREVIEW, this.preview); + } +} diff --git a/src/main/java/com/kamesuta/mc/signpic/gui/config/ConfigGui.java b/src/main/java/com/kamesuta/mc/signpic/gui/config/ConfigGui.java new file mode 100644 index 00000000..91f85d35 --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/gui/config/ConfigGui.java @@ -0,0 +1,51 @@ +package com.kamesuta.mc.signpic.gui.config; +import java.util.ArrayList; +import java.util.List; + +import com.kamesuta.mc.signpic.Config; +import com.kamesuta.mc.signpic.Reference; + +import net.minecraft.client.gui.GuiScreen; +import net.minecraftforge.common.config.ConfigCategory; +import net.minecraftforge.common.config.ConfigElement; +import net.minecraftforge.fml.client.config.GuiConfig; +import net.minecraftforge.fml.client.config.IConfigElement; + +public class ConfigGui extends GuiConfig +{ + + public ConfigGui( final GuiScreen parent ) + { + super( parent, getConfigElements(), Reference.MODID, false, false, GuiConfig.getAbridgedConfigPath( Config.instance.getFilePath() ) ); + } + + private static List getConfigElements() + { + final List list = new ArrayList(); + + for( final String cat : Config.instance.getCategoryNames() ) + { + if( cat.equals( "versionchecker" ) ) + { + continue; + } + + if( cat.equals( "settings" ) ) + { + continue; + } + + final ConfigCategory cc = Config.instance.getCategory( cat ); + + if( cc.isChild() ) + { + continue; + } + + final ConfigElement ce = new ConfigElement( cc ); + list.add( ce ); + } + + return list; + } +} \ No newline at end of file diff --git a/src/main/java/com/kamesuta/mc/signpic/gui/config/ConfigGuiFactory.java b/src/main/java/com/kamesuta/mc/signpic/gui/config/ConfigGuiFactory.java new file mode 100644 index 00000000..9a8aeeae --- /dev/null +++ b/src/main/java/com/kamesuta/mc/signpic/gui/config/ConfigGuiFactory.java @@ -0,0 +1,32 @@ +package com.kamesuta.mc.signpic.gui.config; +import java.util.Set; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +import net.minecraftforge.fml.client.IModGuiFactory; + +public class ConfigGuiFactory implements IModGuiFactory { + @Override + public void initialize( final Minecraft minecraftInstance ) + { + + } + + @Override + public Class mainConfigGuiClass() + { + return ConfigGui.class; + } + + @Override + public Set runtimeGuiCategories() + { + return null; + } + + @Override + public RuntimeOptionGuiHandler getHandlerFor( final RuntimeOptionCategoryElement element ) + { + return null; + } +} \ No newline at end of file diff --git a/src/main/java/com/kamesuta/mc/signpic/handler/CoreHandler.java b/src/main/java/com/kamesuta/mc/signpic/handler/CoreHandler.java index a9824538..812fa0d2 100644 --- a/src/main/java/com/kamesuta/mc/signpic/handler/CoreHandler.java +++ b/src/main/java/com/kamesuta/mc/signpic/handler/CoreHandler.java @@ -3,6 +3,7 @@ import org.lwjgl.util.Timer; import com.kamesuta.mc.signpic.Client; +import com.kamesuta.mc.signpic.Config; import com.kamesuta.mc.signpic.entry.EntryManager; import com.kamesuta.mc.signpic.entry.EntrySlot; import com.kamesuta.mc.signpic.entry.content.ContentManager; @@ -14,12 +15,15 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.client.event.ConfigChangedEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.InputEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; import net.minecraftforge.fml.common.gameevent.TickEvent.ClientTickEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; public class CoreHandler { + public final Config configHandler = Config.instance; public final KeyHandler keyHandler = new KeyHandler(); public final SignHandler signHandler = new SignHandler(); public final EntryManager signEntryManager = EntryManager.instance; @@ -69,13 +73,20 @@ public void onText(final RenderGameOverlayEvent.Text event) { this.renderHandler.onText(event); } + @SubscribeEvent + public void onConfigChanged(final ConfigChangedEvent.OnConfigChangedEvent eventArgs) { + this.configHandler.onConfigChanged(eventArgs); + } + @SubscribeEvent public void onTick(final ClientTickEvent event) { - Client.startSection("signpic_load"); - this.signEntryManager.onTick(); - this.contentManager.onTick(); - this.informationHandler.onTick(event); - EntrySlot.Tick(); - Client.endSection(); + if (event.phase == Phase.END) { + Client.startSection("signpic_load"); + this.signEntryManager.onTick(); + this.contentManager.onTick(); + this.informationHandler.onTick(event); + EntrySlot.Tick(); + Client.endSection(); + } } } diff --git a/src/main/java/com/kamesuta/mc/signpic/handler/SignHandler.java b/src/main/java/com/kamesuta/mc/signpic/handler/SignHandler.java index e2441399..457e2553 100644 --- a/src/main/java/com/kamesuta/mc/signpic/handler/SignHandler.java +++ b/src/main/java/com/kamesuta/mc/signpic/handler/SignHandler.java @@ -43,7 +43,7 @@ public void onSign(final GuiOpenEvent event) { try { final GuiEditSign ges = (GuiEditSign) event.getGui(); final TileEntitySign tileSign = (TileEntitySign) f.get(ges); - Sign.sendSign(CurrentMode.instance.getEntryId(), tileSign); + Sign.placeSign(CurrentMode.instance.getEntryId(), tileSign); event.setCanceled(true); if (!CurrentMode.instance.isState(CurrentMode.State.CONTINUE)) { CurrentMode.instance.setMode(); @@ -74,10 +74,8 @@ public void onClick(final MouseEvent event) { if (CurrentMode.instance.isMode(CurrentMode.Mode.SETPREVIEW)) { Sign.preview.capturePlace(); event.setCanceled(true); - if (!CurrentMode.instance.isState(CurrentMode.State.CONTINUE)) { - CurrentMode.instance.setMode(); - Client.openEditor(); - } + CurrentMode.instance.setMode(); + Client.openEditor(); } else if (CurrentMode.instance.isMode(CurrentMode.Mode.LOAD)) { final TileEntitySign tilesign = Client.getTileSignLooking(); if (tilesign != null) { diff --git a/src/main/java/com/kamesuta/mc/signpic/image/ImageIOLoader.java b/src/main/java/com/kamesuta/mc/signpic/image/ImageIOLoader.java index aca4cf17..14763ef8 100644 --- a/src/main/java/com/kamesuta/mc/signpic/image/ImageIOLoader.java +++ b/src/main/java/com/kamesuta/mc/signpic/image/ImageIOLoader.java @@ -18,6 +18,7 @@ import org.apache.commons.io.IOUtils; import com.google.common.collect.Lists; +import com.kamesuta.mc.signpic.Config; import com.kamesuta.mc.signpic.entry.content.Content; import com.kamesuta.mc.signpic.entry.content.ContentLocation; import com.kamesuta.mc.signpic.entry.content.ContentStateType; @@ -30,7 +31,9 @@ import net.minecraft.util.ResourceLocation; public class ImageIOLoader { - public static final ImageSize MAX_SIZE = new ImageSize().setSize(512, 512); + public static final ImageSize MAX_SIZE = new ImageSize().setSize( + ((Config.instance.imageWidthLimit > 0) ? Config.instance.imageWidthLimit : ImageSize.unknownSize), + ((Config.instance.imageHeightLimit > 0) ? Config.instance.imageHeightLimit : ImageSize.unknownSize)); protected Content content; protected InputStream input; @@ -62,7 +65,7 @@ public ImageTextures load() throws IOException { this.content.state.setType(ContentStateType.LOADING); ImageTextures textures; - if (reader.getFormatName()=="gif") { + if (Config.instance.imageAnimationGif && reader.getFormatName()=="gif") { textures = loadGif(data); } else { textures = loadImage(reader, imagestream); diff --git a/src/main/java/com/kamesuta/mc/signpic/image/RemoteImage.java b/src/main/java/com/kamesuta/mc/signpic/image/RemoteImage.java index 2201d010..a8a8b35e 100644 --- a/src/main/java/com/kamesuta/mc/signpic/image/RemoteImage.java +++ b/src/main/java/com/kamesuta/mc/signpic/image/RemoteImage.java @@ -7,6 +7,7 @@ import com.kamesuta.mc.signpic.Client; import com.kamesuta.mc.signpic.entry.content.Content; +import com.kamesuta.mc.signpic.entry.content.ContentCapacityOverException; import com.kamesuta.mc.signpic.entry.content.ContentDownloader; import com.kamesuta.mc.signpic.entry.content.ContentManager; import com.kamesuta.mc.signpic.entry.content.ContentStateType; @@ -38,6 +39,9 @@ public void onAsyncProcess() { } catch (final URISyntaxException e) { this.content.state.setType(ContentStateType.ERROR); this.content.state.setMessage(I18n.format("signpic.advmsg.invalidurl")); + } catch (final ContentCapacityOverException e) { + this.content.state.setType(ContentStateType.ERROR); + this.content.state.setMessage(I18n.format("signpic.advmsg.capacityover")); } catch (final InvaildImageException e) { this.content.state.setType(ContentStateType.ERROR); this.content.state.setMessage(I18n.format("signpic.advmsg.invalidimage")); diff --git a/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageSize.java b/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageSize.java index a10e1d81..40572e5e 100644 --- a/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageSize.java +++ b/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageSize.java @@ -80,7 +80,10 @@ else if (imagesize.vaildHeight()) } public ImageSize setSize(final ImageSizes s, final float rawWidth, final float rawHeight, final float maxWidth, final float maxHeight) { - s.size(this, rawWidth, rawHeight, maxWidth, maxHeight); + if ((rawWidth == unknownSize && maxWidth == unknownSize) || (rawHeight == unknownSize && maxHeight == unknownSize)) + throw new IllegalArgumentException("No Size Defined"); + s.size(this, rawWidth != unknownSize ? rawWidth : maxWidth, rawHeight != unknownSize ? rawHeight : maxHeight, + maxWidth != unknownSize ? maxWidth : rawWidth, maxHeight != unknownSize ? maxHeight : rawHeight); return this; } diff --git a/src/main/java/com/kamesuta/mc/signpic/information/InformationChecker.java b/src/main/java/com/kamesuta/mc/signpic/information/InformationChecker.java index 47cc15fb..66eac293 100644 --- a/src/main/java/com/kamesuta/mc/signpic/information/InformationChecker.java +++ b/src/main/java/com/kamesuta/mc/signpic/information/InformationChecker.java @@ -4,6 +4,7 @@ import org.apache.commons.lang3.math.NumberUtils; import com.kamesuta.mc.signpic.Client; +import com.kamesuta.mc.signpic.Config; import com.kamesuta.mc.signpic.Reference; import com.kamesuta.mc.signpic.handler.CoreEvent; import com.kamesuta.mc.signpic.util.ChatBuilder; @@ -30,29 +31,25 @@ public void onTick() { final EntityPlayer player = Client.mc.thePlayer; if(this.doneChecking && player != null && !this.triedToWarnPlayer) { final String lang = Client.mc.gameSettings.language; - if (!StringUtils.equals(Reference.VERSION, "${version}")) { + if (Config.instance.informationNotice && !StringUtils.equals(Reference.VERSION, "${version}")) { try { final String[] client = Reference.VERSION.split("\\."); - if (client.length>=2) { + if (client.length>=3) { final int clientBuild1 = Integer.parseInt(client[0]); final int clientBuild2 = Integer.parseInt(client[1]); + final int clientBuild3 = Integer.parseInt(client[2]); boolean betaneedupdate = false; - if (this.unstableVersion!=null && this.unstableVersion.version!=null) { - if (client.length>=4 &&StringUtils.equals(client[3], "beta")) { - if (NumberUtils.isNumber(client[2])) { - final int clientBuild3 = NumberUtils.toInt(client[2]); - final String[] beta = this.unstableVersion.version.split("\\."); - if (beta.length>=4 &&StringUtils.equals(beta[3], "beta")) { - if (NumberUtils.isNumber(beta[0]) && NumberUtils.isNumber(beta[1]) && NumberUtils.isNumber(beta[2])) { - final int betaBuild1 = NumberUtils.toInt(beta[0]); - final int betaBuild2 = NumberUtils.toInt(beta[1]); - final int betaBuild3 = NumberUtils.toInt(beta[2]); - betaneedupdate = (betaBuild1 > clientBuild1) || - (betaBuild1 == clientBuild1 && betaBuild2 > clientBuild2) || - (betaBuild1 == clientBuild1 && betaBuild2 == clientBuild2 && betaBuild3 > clientBuild3); - } - } + if (Config.instance.informationJoinBeta && this.unstableVersion!=null && this.unstableVersion.version!=null) { + final String[] beta = this.unstableVersion.version.split("\\."); + if (beta.length>=4 &&StringUtils.equals(beta[3], "beta")) { + if (NumberUtils.isNumber(beta[0]) && NumberUtils.isNumber(beta[1]) && NumberUtils.isNumber(beta[2])) { + final int betaBuild1 = NumberUtils.toInt(beta[0]); + final int betaBuild2 = NumberUtils.toInt(beta[1]); + final int betaBuild3 = NumberUtils.toInt(beta[2]); + betaneedupdate = (betaBuild1 > clientBuild1) || + (betaBuild1 == clientBuild1 && betaBuild2 > clientBuild2) || + (betaBuild1 == clientBuild1 && betaBuild2 == clientBuild2 && betaBuild3 > clientBuild3); } } } @@ -63,12 +60,15 @@ public void onTick() { if (this.onlineVersion!=null && this.onlineVersion.version!=null) { final String[] online = this.onlineVersion.version.split("\\."); - if (online.length>=2) { + if (online.length>=3) { boolean needupdate = false; if (!betaneedupdate) { final int onlineBuild1 = Integer.parseInt(online[0]); final int onlineBuild2 = Integer.parseInt(online[1]); - needupdate = (onlineBuild1 > clientBuild1) || (onlineBuild1 == clientBuild1 && onlineBuild2 > clientBuild2); + final int onlineBuild3 = Integer.parseInt(online[2]); + needupdate = (onlineBuild1 > clientBuild1) || + (onlineBuild1 == clientBuild1 && onlineBuild2 > clientBuild2) || + (onlineBuild1 == clientBuild1 && onlineBuild2 == clientBuild2 && onlineBuild3 > clientBuild3); } if(betaneedupdate || needupdate) { diff --git a/src/main/java/com/kamesuta/mc/signpic/proxy/ClientProxy.java b/src/main/java/com/kamesuta/mc/signpic/proxy/ClientProxy.java index 39c505be..e85b7052 100644 --- a/src/main/java/com/kamesuta/mc/signpic/proxy/ClientProxy.java +++ b/src/main/java/com/kamesuta/mc/signpic/proxy/ClientProxy.java @@ -58,8 +58,6 @@ public void preInit(final FMLPreInitializationEvent event) { Client.mcDir = mcdir; Client.signpicDir = signpicdir; Client.signpicCacheDir = cachedir; - Client.configDir = event.getModConfigurationDirectory(); - Client.configFile = event.getSuggestedConfigurationFile(); Client.modDir = new File(mcdir, "mods"); Client.modFile = event.getSourceFile(); diff --git a/src/main/java/com/kamesuta/mc/signpic/render/CustomTileEntitySignRenderer.java b/src/main/java/com/kamesuta/mc/signpic/render/CustomTileEntitySignRenderer.java index c57ba514..903ffb7d 100644 --- a/src/main/java/com/kamesuta/mc/signpic/render/CustomTileEntitySignRenderer.java +++ b/src/main/java/com/kamesuta/mc/signpic/render/CustomTileEntitySignRenderer.java @@ -103,15 +103,7 @@ public void renderSignPicture(final Entry entry, final int destroy, final float GlStateManager.popMatrix(); } - public void renderSignPictureBase(final TileEntitySign tile, final double x, final double y, final double z, final float partialTicks, final int destroy, final float opacity) { - final Entry entry = EntryId.fromTile(tile).entry(); - if (entry.isValid()) { - if (CurrentMode.instance.isState(CurrentMode.State.SEE)) { - RenderHelper.startTexture(); - GlStateManager.color(1f, 1f, 1f, opacity * .5f); - super.renderTileEntityAt(tile, x, y, z, partialTicks, destroy); - } - + public void translateBase(final TileEntitySign tile, final double x, final double y, final double z, final float rotateratio) { // Vanilla Translate final Block block = tile.getBlockType(); GlStateManager.pushMatrix(); @@ -134,6 +126,19 @@ public void renderSignPictureBase(final TileEntitySign tile, final double x, fin GlStateManager.rotate(-f3, 0.0F, 1.0F, 0.0F); GlStateManager.translate(0.0F, 0.0F, -0.4375F); } + } + + public void renderSignPictureBase(final TileEntitySign tile, final double x, final double y, final double z, final float partialTicks, final int destroy, final float opacity) { + final Entry entry = EntryId.fromTile(tile).entry(); + if (entry.isValid()) { + if (CurrentMode.instance.isState(CurrentMode.State.SEE)) { + RenderHelper.startTexture(); + GlStateManager.color(1f, 1f, 1f, opacity * .5f); + super.renderTileEntityAt(tile, x, y, z, partialTicks, destroy); + } + + GlStateManager.pushMatrix(); + translateBase(tile, x, y, z, 1f); // Draw Canvas GlStateManager.disableCull(); diff --git a/src/main/java/com/kamesuta/mc/signpic/render/SignPicRender.java b/src/main/java/com/kamesuta/mc/signpic/render/SignPicRender.java index c9f639c3..883d5afd 100644 --- a/src/main/java/com/kamesuta/mc/signpic/render/SignPicRender.java +++ b/src/main/java/com/kamesuta/mc/signpic/render/SignPicRender.java @@ -4,6 +4,7 @@ import com.kamesuta.mc.bnnwidget.WGui; import com.kamesuta.mc.signpic.Client; +import com.kamesuta.mc.signpic.Config; import com.kamesuta.mc.signpic.entry.Entry; import com.kamesuta.mc.signpic.entry.EntryId; import com.kamesuta.mc.signpic.entry.content.Content; @@ -31,10 +32,10 @@ public SignPicRender() { @CoreEvent public void onRender(final RenderWorldLastEvent event) { - float opacity = 0.7f; + float opacity = Config.instance.renderPreviewFixedOpacity; if (CurrentMode.instance.isMode(CurrentMode.Mode.SETPREVIEW) || CurrentMode.instance.isMode(CurrentMode.Mode.PLACE)) { Sign.preview.capturePlace(); - opacity *= 0.7f; + opacity = Config.instance.renderPreviewFloatedOpacity; } if (CurrentMode.instance.isState(CurrentMode.State.PREVIEW)) { if (Sign.preview.isRenderable() && Sign.preview.isVisible()) { @@ -98,7 +99,7 @@ public void onText(final RenderGameOverlayEvent.Text event) { if (advmsg != null) event.getLeft().add(I18n.format("signpic.over.advmsg", advmsg)); if (tilesign.signText != null) - event.getLeft().add(I18n.format("signpic.over.raw", tilesign.signText[0], tilesign.signText[1], tilesign.signText[2], tilesign.signText[3])); + event.getLeft().add(I18n.format("signpic.over.raw", tilesign.signText[0].getUnformattedText(), tilesign.signText[1].getUnformattedText(), tilesign.signText[2].getUnformattedText(), tilesign.signText[3].getUnformattedText())); event.getLeft().add(I18n.format("signpic.over.local", content.image.getLocal())); } } diff --git a/src/main/java/com/kamesuta/mc/signpic/util/Sign.java b/src/main/java/com/kamesuta/mc/signpic/util/Sign.java index 34064e67..cde2f5fc 100644 --- a/src/main/java/com/kamesuta/mc/signpic/util/Sign.java +++ b/src/main/java/com/kamesuta/mc/signpic/util/Sign.java @@ -1,8 +1,12 @@ package com.kamesuta.mc.signpic.util; +import org.lwjgl.util.Timer; + import com.kamesuta.mc.signpic.Client; +import com.kamesuta.mc.signpic.Config; import com.kamesuta.mc.signpic.entry.EntryId; import com.kamesuta.mc.signpic.entry.EntryIdBuilder; +import com.kamesuta.mc.signpic.gui.GuiPAAS; import com.kamesuta.mc.signpic.preview.SignEntity; import net.minecraft.client.network.NetHandlerPlayClient; @@ -27,4 +31,62 @@ public static void sendSign(final EntryId entryId, final TileEntitySign sourceen nethandlerplayclient.sendPacket(new CPacketUpdateSign(sourceentity.getPos(), sourceentity.signText)); sourceentity.setEditable(true); } + + public static void placeSign(final EntryId entryId, final TileEntitySign sourceentity) { + if (Config.instance.multiplayPAAS && !Client.mc.isSingleplayer()) + Client.mc.displayGuiScreen(new GuiPAAS(new SendPacketTask(entryId, sourceentity))); + else + sendSign(entryId, sourceentity); + } + + public static class SendPacketTask { + public final long limit; + public final EntryId id; + public final String[] lines; + public final TileEntitySign entity; + public final Timer timer; + + public SendPacketTask(final EntryId id, final TileEntitySign entity) { + this.timer = new Timer(); + this.lines = new String[4]; + id.toStrings(this.lines); + this.limit = getExpectedEditTime(this.lines, false); + this.id = id; + this.entity = entity; + } + + private void sendPacket() { + Sign.sendSign(this.id, this.entity); + } + + public boolean tick() { + if (this.timer.getTime() * 1000 > this.limit) { + sendPacket(); + return true; + } + return false; + } + + private static long getExpectedEditTime(final String[] lines, final boolean skipEmpty) { + long expected = Config.instance.multiplayPAASMinEditTime; + int n = 0; + for (String line : lines){ + if (line != null){ + line = line.trim().toLowerCase(); + if (!line.isEmpty()){ + final int chars = line.length(); + n += 1; + expected += Config.instance.multiplayPAASMinCharTime * chars; + } + } + } + if (skipEmpty && n == 0) { + return 0; + } + if (n > 1){ + expected += Config.instance.multiplayPAASMinLineTime * n; + } + return expected; + } + } } diff --git a/src/main/resources/assets/signpic/lang/en_US.lang b/src/main/resources/assets/signpic/lang/en_US.lang index f80ad552..49e8f4ee 100644 --- a/src/main/resources/assets/signpic/lang/en_US.lang +++ b/src/main/resources/assets/signpic/lang/en_US.lang @@ -21,6 +21,7 @@ signpic.key.category=Sign Picture signpic.key.gui=Open GUI # GUI +## Sign Editor signpic.gui.editor.see=View Sign signpic.gui.editor.preview=Preview signpic.gui.editor.continue=Continue @@ -28,7 +29,7 @@ signpic.gui.editor.load=Load signpic.gui.editor.place=Place signpic.gui.editor.cancel=Cancel signpic.gui.editor.textfield=Place URL Here! -## Size +### Size signpic.gui.editor.size.category=Size signpic.gui.editor.size.width=W signpic.gui.editor.size.height=H @@ -36,7 +37,7 @@ signpic.gui.editor.size.width.neg=- signpic.gui.editor.size.width.pos=+ signpic.gui.editor.size.height.neg=- signpic.gui.editor.size.height.pos=+ -## Offset +### Offset signpic.gui.editor.offset.category=Offset signpic.gui.editor.offset.x=X signpic.gui.editor.offset.x.neg=⇦ @@ -47,7 +48,7 @@ signpic.gui.editor.offset.y.pos=⇧ signpic.gui.editor.offset.z=Z signpic.gui.editor.offset.z.neg=↗ signpic.gui.editor.offset.z.pos=↙ -## Rotation +### Rotation signpic.gui.editor.rotation.category=Rotation signpic.gui.editor.rotation.up=↑ signpic.gui.editor.rotation.down=↓ @@ -58,6 +59,9 @@ signpic.gui.editor.rotation.remove=- signpic.gui.editor.rotation.add=+ signpic.gui.editor.rotation.neg=- signpic.gui.editor.rotation.pos=+ +## Prevent Anti-AutoSign +signpic.gui.paas.count=Please Wait ( %d / %d letters ) +signpic.gui.paas.time=Esc for Cancel ( %.2f / %.2f seconds ) # Image State signpic.state.init=Waiting... @@ -72,6 +76,7 @@ signpic.state.error=ERROR # Image State Additional Message signpic.advmsg.invalidurl=Invalid URL +signpic.advmsg.capacityover=CapacityOver signpic.advmsg.invalidimage=Invalid Image signpic.advmsg.ioerror=Failed to Read: §7%s signpic.advmsg.unknown=Unknown Error: §7%s diff --git a/src/main/resources/assets/signpic/lang/ja_JP.lang b/src/main/resources/assets/signpic/lang/ja_JP.lang index bba1ae0d..4b1fa9aa 100644 --- a/src/main/resources/assets/signpic/lang/ja_JP.lang +++ b/src/main/resources/assets/signpic/lang/ja_JP.lang @@ -8,6 +8,7 @@ signpic.over.mode.setpreview=ブロックをクリックしてプレビュー位 signpic.chat.error.place=[§6SignPicture§r] 申し訳ございませんがエラーが発生したためこの機能をご利用になることができません。 # GUI +## Sign Editor signpic.gui.editor.see=実体表示 signpic.gui.editor.preview=プレビュー signpic.gui.editor.continue=連続 @@ -15,14 +16,17 @@ signpic.gui.editor.load=ロード signpic.gui.editor.place=設置 signpic.gui.editor.cancel=キャンセル signpic.gui.editor.textfield=ここにURLを入力! -## Size +### Size signpic.gui.editor.size.category=サイズ signpic.gui.editor.size.width=幅 signpic.gui.editor.size.height=高さ -## Offset +### Offset signpic.gui.editor.offset.category=オフセット -## Rotation +### Rotation signpic.gui.editor.rotation.category=回転 +## Prevent Anti-AutoSign +signpic.gui.paas.count=しばらくお待ちください ( %s / %s 文字 ) +signpic.gui.paas.time=Esc でキャンセル ( %s / %s 秒 ) # Image State signpic.state.init=待機中... @@ -37,6 +41,7 @@ signpic.state.error=エラー # Image State Additional Message signpic.advmsg.invalidurl=不正なURL +signpic.advmsg.capacityover=容量オーバー signpic.advmsg.invalidimage=不正な画像 signpic.advmsg.ioerror=ファイル読み込み失敗: §7%s signpic.advmsg.unknown=不明なエラー: §7%s