
Guma!
Members-
Posts
75 -
Credits
0 -
Joined
-
Last visited
-
Feedback
0%
Everything posted by Guma!
-
[Discussion] pro/contra current lineage2 forks
Guma! replied to Intrepid's topic in Server Development Discussion [L2J]
@Intrepid know you're not only talking interlude but if to speak choose a project stopped, an asset or a paid where other project interlude alive? I do not have five years of experience in java or L2J I only have one, I'm just beginning. that is to say that I, you guys will see this project per five years or more. -
[Discussion] pro/contra current lineage2 forks
Guma! replied to Intrepid's topic in Server Development Discussion [L2J]
but against a topic l2jbrasil another project on which to speak? L2JTeon? L2JEclipse project or a dead time fans? L2J Server or L2jFree where hackers are just the beginning? L2JEqual seems to work again DevilMyCry but adds custom config but and but and but custom config etc. .. l2jbrasil is based l2jserver if the code is dirty l2jbrasil, l2jserver also . was not changed anything in the code only a few implementations so that the project still exists only in the event as TVT jserver remains the same code. the problem is that simply like to speak ill but every project has a good side and a bad did not like? Make your own Projeto then. -
[List - Share] L2J Projects & Guiding.
Guma! replied to Coyote™'s topic in Server Development Discussion [L2J]
you make me laugh remove the project from your list since it is so hated here. not need to disclose my project :p paz. -
[List - Share] L2J Projects & Guiding.
Guma! replied to Coyote™'s topic in Server Development Discussion [L2J]
Thanks for removing the link but .. The project is alive as ever xD -
[Guide]Compile with maven [without eclipse]
Guma! replied to Sуѕтємƒяєαк's topic in Server Development Discussion [L2J]
link off... -
level 15 ? Oo loL
-
[List - Share] L2J Projects & Guiding.
Guma! replied to Coyote™'s topic in Server Development Discussion [L2J]
@ Coyote™ simple is the only active project interlude and prefer a project than a free paid. all projects contain bug so obviously, l2jserver is active until today and buggy too. -
[reJunkyard Posts]L2JBrasil Interlude Project omg
Guma! replied to skills's topic in Server Development Discussion [L2J]
I see many wanting maybe they want these projects by half or pay for some -
[reJunkyard Posts]L2JBrasil Interlude Project omg
Guma! replied to skills's topic in Server Development Discussion [L2J]
use forum http://projeto.l2jbrasil.com/ -
removes these custom script and starts the server again ... if not give error because is the script.
-
[List - Share] L2J Projects & Guiding.
Guma! replied to Coyote™'s topic in Server Development Discussion [L2J]
kkkkkkk maybe you have something better to show us!? why do you to speak ill of others you're the best. ;D ;D -
[Help]How to open Java file with eclipse
Guma! replied to papuna's question in Request Server Development Help [L2J]
you trying to open a file .java or .jar? -
Help me compiling...
Guma! replied to removed_001's question in Request Server Development Help [L2J]
even has a program to decompile the file. jar but an overwhelming task would be easy you compile a project L2J final make their modifications and updates the .jar files on your server pack -
[HELP] About eclipse
Guma! replied to xXxJimPowerxXx's question in Request Server Development Help [L2J]
a good read these two tutorials And you'll know. http://www.maxcheaters.com/forum/index.php?topic=81843.0 http://www.maxcheaters.com/forum/index.php?topic=73559.0 -
which project do you use? gameserver appears in a mistake too?
-
do not know if it was good because I used google translate
-
I come here to post this tutorial which I think was missing here in the forum. I'll start with the buffer by template here is a part of the HTML buffer This part that I highlighted is the part that directs the html for the table of buffs <button value="Wind Walk" action="bypass -h npc_%objectId%_MakeBuffs WindWalkbyUsweer" width=75 height=21 back="L2UI_ch3.Btn1_normalOn" fore="L2UI_ch3.Btn1_normal"> Now I will explain each part of the html 1 - button -> creates a button in html (can also be replaced by <a> ...</ a> if this is a simple NPC) 2 - value -> the name that appears on the button (in this case "wind walk") 3 - action -> here is the fundamental part of the html, because it redirects the npc for the DB, using this code:"bypass -h npc_%objectId%_MakeBuffs WindWalkbyUsweer" bypass -h npc_%objectId%_MakeBuffs (The command MakeBuffs in some servers will not work because it needs to be implemented in java) this is the part that sends the player buff npc WindWalkbyUsweer this is the buff that he will give pro player, he is on the table should buff_templates 4 - width and height-> here is the width and height of the html button, respectively 5 - back and fore -> here are the images when the button is clicked and normal, respectively Here is the table buff_templates here comes the question what each column of this table? 1 - ID -> Here you find the ID name of the buff for targeting .2 - Name -> Here is the name of the buff that used to drive (in this case WindWalkbyUsweer) .3 - Skill_id -> Here is the id of the buffer will use that skill 4 - Skill_name -> name of the skill that will be used by the buffer 5 - Skill_level -> Level of the skill that will be used by the buffer .6 - Skill Force -> here is used when the skill has stocktype (perhaps one that leaves this column) .7 - Skill order -> used when the buffer has the option full buff or buff fight (those that give many buffs at once) then place the order so the buffs you want it to be used first. .8 - Char_min_level -> the minimum level that the player must have to be buffado .9 - Char_max_level -> the maximum level that the player may be buffado .10 - Char_race -> specifiable which race may be char buff (put 0 so that all races can be buff) .11 - Char_class -> specifiable which class can buff it (put 0 for all classes that can buff) .12 - Char_faction -> not tested this yet but I think it is to buff a particular clan .13 - Price_adena -> here is the price of the buff .14 - Price_points -> here can leave 0 So only need to edit the html and table templates of the buff so I guess you guys already know how to add or remove a buff npc for template credits: KhayrusS
-
[Share]PvP/Pk Npc Ranking- Works on L2JBrasil
Guma! replied to Apithanos's topic in Server Shares & Files [L2J]
good job tnx for share... -
NPC to enchant items for l2jbrasil this to enchant + 65353 but this can be changed in the script Item.setEnchantLevel(itemEnchant+65535) Downlaod
-
+ if (Config.NAME_COLOR_SYSTEM) + { + activeChar.getAppearance().setTitleColor(Config.NAME_COLOR); + } +
-
[Share] Pack NPCs 2010 by Foxer (IL) v1.1 UPDATED
Guma! replied to -FxR-'s topic in Server Shares & Files [L2J]
god job tnx for sharing -
[Share] Olympiad Protection Interlude - Gracia Final
Guma! replied to Horus's topic in Server Shares & Files [L2J]
you added this code? java/net/sf/l2j/gameserver/network/SystemMessageId.java /** * ID: 782<br> * Message: $s1 Has Lost $s2 Olympiad Points. */ C1_HAS_LOST_S2_OLYMPIAD_POINTS(782); -
[Interlude] Project Interlude L2jRox
Guma! replied to Inspector's topic in Server Development Discussion [L2J]
@ Sweeparanoid I'm just one contributor to project what's wrong? l2jbrasil my project is and always will be, you never see him dead! @inspector nunca vi um povo pra fala tanto mal se acustume. -
Custom start itens for mage and fight Index: /TrunK/L2JBrasil_CORE/java/config/L2JBrasil.properties =================================================================== --- /TrunK/L2JBrasil_CORE/java/config/L2JBrasil.properties (revision 113) +++ /TrunK/L2JBrasil_CORE/java/config/L2JBrasil.properties (revision 114) @@ -3,15 +3,18 @@ +# --------------------------------------------------------------------------- +# Starting Custom Items System +# --------------------------------------------------------------------------- +# Example: StartingCustomItems = itemId,amount;itemId,amount;itemId,amount +# Enable/Disable Starting Custom Items System +AllowStartingCustomItems = False + +# Starting itens for fighter's classes +StartingCustomItemsFighter = 57,0 + +# Starting itens for mage's classes +StartingCustomItemsMage = 57,0 Index: /TrunK/L2JBrasil_CORE/java/net/sf/l2j/Config.java =================================================================== --- /TrunK/L2JBrasil_CORE/java/net/sf/l2j/Config.java (revision 113) +++ /TrunK/L2JBrasil_CORE/java/net/sf/l2j/Config.java (revision 114) @@ -31,4 +31,5 @@ import javolution.util.FastList; import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance; +import net.sf.l2j.gameserver.util.StringUtil; /** @@ -866,4 +867,7 @@ public static boolean ALLOW_TRADEOFF_VOICE_COMMAND; public static boolean OVER_ENCHANT_PROTECTION_ENABLED; + public static boolean STARTING_CUSTOM_ITEMS; + public static List<int[]> STARTING_CUSTOM_ITEMS_F = new FastList<int[]>(); + public static List<int[]> STARTING_CUSTOM_ITEMS_M = new FastList<int[]>(); public static FastList<Integer> OLY_RESTRICTED_ITEMS_LIST = new FastList<Integer>(); public static int RUN_SPD_BOOST; @@ -1214,6 +1218,6 @@ try { - Properties L2JBrasil = new Properties(); - InputStream is = new FileInputStream(new File(L2JBRASIL)); + Properties L2JBrasil = new Properties(); + InputStream is = new FileInputStream(new File(L2JBRASIL)); L2JBrasil.load(is); is.close(); @@ -1235,5 +1239,47 @@ ALLOW_TRADEOFF_VOICE_COMMAND = Boolean.parseBoolean(L2JBrasil.getProperty("TradeOffCommand","False")); OVER_ENCHANT_PROTECTION_ENABLED = Boolean.parseBoolean(L2JBrasil.getProperty("OverEnchantProtection", "True")); + STARTING_CUSTOM_ITEMS = Boolean.parseBoolean(L2JBrasil.getProperty("AllowStartingCustomItems", "False")); + + String[] propertySplit = L2JBrasil.getProperty("StartingCustomItemsMage", "57,0").split(";"); + for (String reward : propertySplit) + { + String[] rewardSplit = reward.split(","); + if (rewardSplit.length != 2) + _log.warning(StringUtil.concat("StartingCustomItemsMage[Config.load()]: invalid config property -> StartingCustomItemsMage \"", reward, "\"")); + else + { + try + { + STARTING_CUSTOM_ITEMS_M.add(new int[]{Integer.parseInt(rewardSplit[0]), Integer.parseInt(rewardSplit[1])}); + } + catch (NumberFormatException nfe) + { + if (!reward.isEmpty()) + _log.warning(StringUtil.concat("StartingCustomItemsMage[Config.load()]: invalid config property -> StartingCustomItemsMage \"", reward, "\"")); + } + } + } + + propertySplit = L2JBrasil.getProperty("StartingCustomItemsFighter", "57,0").split(";"); + for (String reward : propertySplit) + { + String[] rewardSplit = reward.split(","); + if (rewardSplit.length != 2) + _log.warning(StringUtil.concat("StartingCustomItemsFighter[Config.load()]: invalid config property -> StartingCustomItemsFighter \"", reward, "\"")); + else + { + try + { + STARTING_CUSTOM_ITEMS_F.add(new int[]{Integer.parseInt(rewardSplit[0]), Integer.parseInt(rewardSplit[1])}); + } + catch (NumberFormatException nfe) + { + if (!reward.isEmpty()) + _log.warning(StringUtil.concat("StartingCustomItemsFighter[Config.load()]: invalid config property -> StartingCustomItemsFighter \"", reward, "\"")); + } + } + } + + NOBLE_CUSTOM_ITEM_ID = Integer.parseInt(L2JBrasil.getProperty("NobleItemId", "6673")); ALLOW_NOBLE_CUSTOM_ITEM = Boolean.parseBoolean(L2JBrasil.getProperty("AllowNobleCustomItem", "False")); ACTIVE_SUB_NEEDED_TO_USE_NOBLE_ITEM = Boolean.parseBoolean(L2JBrasil.getProperty("ActiveSubNeededToUseNobleItem", "True")); Index: /TrunK/L2JBrasil_CORE/java/net/sf/l2j/gameserver/clientpackets/CharacterCreate.java =================================================================== --- /TrunK/L2JBrasil_CORE/java/net/sf/l2j/gameserver/clientpackets/CharacterCreate.java (revision 101) +++ /TrunK/L2JBrasil_CORE/java/net/sf/l2j/gameserver/clientpackets/CharacterCreate.java (revision 114) @@ -175,5 +175,47 @@ newChar.addAdena("Init", Config.STARTING_ADENA, null, false); - if (Config.STARTING_LEVEL > 1) + if (Config.STARTING_CUSTOM_ITEMS) + { + if (newChar.isMageClass()) + { + // Iterate over all Starting Custom Items + for (int[] reward : Config.STARTING_CUSTOM_ITEMS_M) + { + // Check for stackable item, non stackabe items need to be added one by one + if (ItemTable.getInstance().createDummyItem(reward[0]).isStackable()) + { + newChar.getInventory().addItem("STARTING_CUSTOM_ITEMS_M", reward[0], reward[1], newChar, null); + } + else + { + for (int i = 0; i < reward[1]; ++i) + { + newChar.getInventory().addItem("STARTING_CUSTOM_ITEMS_M", reward[0], 1, newChar, null); + } + } + } + } + else + { + // Iterate over all Starting Custom Items + for (int[] reward : Config.STARTING_CUSTOM_ITEMS_F) + { + // Check for stackable item, non stackabe items need to be added one by one + if (ItemTable.getInstance().createDummyItem(reward[0]).isStackable()) + { + newChar.getInventory().addItem("STARTING_CUSTOM_ITEMS_F", reward[0], reward[1], newChar, null); + } + else + { + for (int i = 0; i < reward[1]; ++i) + { + newChar.getInventory().addItem("STARTING_CUSTOM_ITEMS_F", reward[0], 1, newChar, null); + } + } + } + } + } + + if (Config.STARTING_LEVEL > 1) { newChar.getStat().addLevel(--Config.STARTING_LEVEL); StringUtil.java Index: /TrunK/L2JBrasil_CORE/java/net/sf/l2j/gameserver/util/StringUtil.java =================================================================== --- /TrunK/L2JBrasil_CORE/java/net/sf/l2j/gameserver/util/StringUtil.java (revision 114) +++ /TrunK/L2JBrasil_CORE/java/net/sf/l2j/gameserver/util/StringUtil.java (revision 114) @@ -0,0 +1,297 @@ +/* + * $Header$ + * + * $Author: fordfrog $ $Date$ $Revision$ $Log$ + * + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see <http://www.gnu.org/licenses/>. + */ +package net.sf.l2j.gameserver.util; + +/** + * String utilities optimized for the best performance. + * + * <h1>How to Use It</h1> <h2>concat() or append()</h2> If concatenating strings + * in single call, use StringUtil.concat(), otherwise use StringUtil.append() + * and its variants. <h2>Minimum Calls</h2> Bad: + * + * <pre> + * final StringBuilder sbString = new StringBuilder(); + * StringUtil.append(sbString, "text 1", String.valueOf(npcId)); + * StringUtil.append("text 2"); + * </pre> + * + * Good: + * + * <pre> + * final StringBuilder sbString = new StringBuilder(); + * StringUtil.append(sbString, "text 1", String.valueOf(npcId), "text 2"); + * </pre> + * + * Why?<br/> + * Because the less calls you do, the less memory re-allocations have to be done + * so the whole text fits into the memory and less array copy tasks has to be + * performed. So if using less calls, less memory is used and string + * concatenation is faster. <h2>Size Hints for Loops</h2> Bad: + * + * <pre> + * final StringBuilder sbString = new StringBuilder(); + * StringUtil.append(sbString, "header start", someText, "header end"); + * for (int i = 0; i < 50; i++) + * { + * StringUtil.append(sbString, "text 1", stringArray[i], "text 2"); + * } + * </pre> + * + * Good: + * + * <pre> + * final StringBuilder sbString = StringUtil.startAppend(1300, "header start", someText, "header end"); + * for (int i = 0; i < 50; i++) + * { + * StringUtil.append(sbString, "text 1", stringArray[i], "text 2"); + * } + * </pre> + * + * Why?<br/> + * When using StringUtil.append(), memory is only allocated to fit in the + * strings in method argument. So on each loop new memory for the string has to + * be allocated and old string has to be copied to the new string. With size + * hint, even if the size hint is above the needed memory, memory is saved + * because new memory has not to be allocated on each cycle. Also it is much + * faster if no string copy tasks has to be performed. So if concatenating + * strings in a loop, count approximately the size and set it as the hint for + * the string builder size. It's better to make the size hint little bit larger + * rather than smaller.<br/> + * In case there is no text appended before the cycle, just use <code>new + * StringBuilder(1300)</code>. <h2>Concatenation and Constants</h2> Bad: + * + * <pre> + * StringUtil.concat("text 1 ", "text 2", String.valueOf(npcId)); + * </pre> + * + * Good: + * + * <pre> + * StringUtil.concat("text 1 " + "text 2", String.valueOf(npcId)); + * </pre> + * + * or + * + * <pre> + * StringUtil.concat("text 1 text 2", String.valueOf(npcId)); + * </pre> + * + * Why?<br/> + * It saves some cycles when determining size of memory that needs to be + * allocated because less strings are passed to concat() method. But do not use + * + for concatenation of non-constant strings, that degrades performance and + * makes extra memory allocations needed. <h2>Concatenation and Constant + * Variables</h2> Bad: + * + * <pre> + * String glue = "some glue"; + * StringUtil.concat("text 1", glue, "text 2", glue, String.valueOf(npcId)); + * </pre> + * + * Good: + * + * <pre> + * final String glue = "some glue"; + * StringUtil.concat("text 1" + glue + "text2" + glue, String.valueOf(npcId)); + * </pre> + * + * Why? Because when using <code>final</code> keyword, the <code>glue</code> is + * marked as constant string and compiler treats it as a constant string so it + * is able to create string "text1some gluetext2some glue" during the + * compilation. But this only works in case the value is known at compilation + * time, so this cannot be used for cases like + * <code>final String objectIdString = + * String.valueOf(getObjectId)</code>. <h2>StringBuilder Reuse</h2> Bad: + * + * <pre> + * final StringBuilder sbString1 = new StringBuilder(); + * StringUtil.append(sbString1, "text 1", String.valueOf(npcId), "text 2"); + * ... // output of sbString1, it is no more needed + * final StringBuilder sbString2 = new StringBuilder(); + * StringUtil.append(sbString2, "text 3", String.valueOf(npcId), "text 4"); + * </pre> + * + * Good: + * + * <pre> + * final StringBuilder sbString = new StringBuilder(); + * StringUtil.append(sbString, "text 1", String.valueOf(npcId), "text 2"); + * ... // output of sbString, it is no more needed + * sbString.setLength(0); + * StringUtil.append(sbString, "text 3", String.valueOf(npcId), "text 4"); + * </pre> + * + * Why?</br> In first case, new memory has to be allocated for the second + * string. In second case already allocated memory is reused, but only in case + * the new string is not longer than the previously allocated string. Anyway, + * the second way is better because the string either fits in the memory and + * some memory is saved, or it does not fit in the memory, and in that case it + * works as in the first case. <h2>Primitives to Strings</h2> To convert + * primitives to string, use String.valueOf(). <h2>How much faster is it?</h2> + * Here are some results of my tests. Count is number of strings concatenated. + * Don't take the numbers as 100% true as the numbers are affected by other + * programs running on my computer at the same time. Anyway, from the results it + * is obvious that using StringBuilder with predefined size is the fastest (and + * also most memory efficient) solution. It is about 5 times faster when + * concatenating 7 strings, compared to TextBuilder. Also, with more strings + * concatenated, the difference between StringBuilder and TextBuilder gets + * larger. In code, there are many cases, where there are concatenated 50+ + * strings so the time saving is even greater. + * + * <pre> + * Count: 2 + * TextBuilder: 1893 + * TextBuilder with size: 1703 + * String: 1033 + * StringBuilder: 993 + * StringBuilder with size: 1024 + * Count: 3 + * TextBuilder: 1973 + * TextBuilder with size: 1872 + * String: 2583 + * StringBuilder: 1633 + * StringBuilder with size: 1156 + * Count: 4 + * TextBuilder: 2188 + * TextBuilder with size: 2229 + * String: 4207 + * StringBuilder: 1816 + * StringBuilder with size: 1444 + * Count: 5 + * TextBuilder: 9185 + * TextBuilder with size: 9464 + * String: 6937 + * StringBuilder: 2745 + * StringBuilder with size: 1882 + * Count: 6 + * TextBuilder: 9785 + * TextBuilder with size: 10082 + * String: 9471 + * StringBuilder: 2889 + * StringBuilder with size: 1857 + * Count: 7 + * TextBuilder: 10169 + * TextBuilder with size: 10528 + * String: 12746 + * StringBuilder: 3081 + * StringBuilder with size: 2139 + * </pre> + * + * @author fordfrog + */ +public final class StringUtil +{ + + private StringUtil() + { + } + + /** + * Concatenates strings. + * + * @param strings + * strings to be concatenated + * + * @return concatenated string + * + * @see StringUtil + */ + public static String concat(final String... strings) + { + final StringBuilder sbString = new StringBuilder(getLength(strings)); + + for (final String string : strings) + { + sbString.append(string); + } + + return sbString.toString(); + } + + /** + * Creates new string builder with size initializated to + * <code>sizeHint</code>, unless total length of strings is greater than + * <code>sizeHint</code>. + * + * @param sizeHint + * hint for string builder size allocation + * @param strings + * strings to be appended + * + * @return created string builder + * + * @see StringUtil + */ + public static StringBuilder startAppend(final int sizeHint, final String... strings) + { + final int length = getLength(strings); + final StringBuilder sbString = new StringBuilder(sizeHint > length ? sizeHint : length); + + for (final String string : strings) + { + sbString.append(string); + } + + return sbString; + } + + /** + * Appends strings to existing string builder. + * + * @param sbString + * string builder + * @param strings + * strings to be appended + * + * @see StringUtil + */ + public static void append(final StringBuilder sbString, final String... strings) + { + sbString.ensureCapacity(sbString.length() + getLength(strings)); + + for (final String string : strings) + { + sbString.append(string); + } + } + + /** + * Counts total length of all the strings. + * + * @param strings + * array of strings + * + * @return total length of all the strings + */ + private static int getLength(final String[] strings) + { + int length = 0; + + for (final String string : strings) + { + if (string == null) + length += 4; + else + length += string.length(); + } + + return length; + } +}