AdminNight 0 Опубликовано 11 августа, 2011 Что нада дописат по пути com.l2jserver.gameserver.network.clientpackets;- MultiSellChoose ,чтобы в Alt+B могли покупать обычные игроки ?(проблема в том что гмом могу купить вещи в Alt+B Гм-шопе.Перезахожу обычным игроком ,захожу в тот же Shop и оно там не чего не покупается.Я нажимаю купить оно вообще не реагирует ) Сразу говарю в Google нема ! Темы такие есть ответа на них нормально не нашел! Копать надо в MultisellChoose это точно но что там дописать и где. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
lacosta 206 Опубликовано 11 августа, 2011 надо камунити борт реализовать =) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
AdminNight 0 Опубликовано 11 августа, 2011 Ты просветил) Оно у меня реализовано все работает кроме гм шопа . В комунити гм шопе могут покупать ток админы вот в чем прикол! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mr.Smith 128 Опубликовано 11 августа, 2011 Ты просветил)Оно у меня реализовано все работает кроме гм шопа . В комунити гм шопе могут покупать ток админы вот в чем прикол! Нужно убрать проверку if (!player.isGm) из коммунити, и тогда будет вам щастье, если же нету исходников, тогда не как разве что прийдется декомпильнуть класс CommunityBoard.java, и убрать проверку, а потом впихнуть обратно, или перекомпелировать как отдельный .jar файл. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
AdminNight 0 Опубликовано 11 августа, 2011 Имсходники как раз есть но в CommunityBoard.java Не нашел такого( вот моя комунка i Скрытый текстmport com.l2jserver.Config;import com.l2jserver.gameserver.communitybbs.Manager.BuffBBSManager; import com.l2jserver.gameserver.communitybbs.Manager.ClanBBSManager; import com.l2jserver.gameserver.communitybbs.Manager.ClassBBSManager; import com.l2jserver.gameserver.communitybbs.Manager.PostBBSManager; import com.l2jserver.gameserver.communitybbs.Manager.RegionBBSManager; import com.l2jserver.gameserver.communitybbs.Manager.TeleportBBSManager; import com.l2jserver.gameserver.communitybbs.Manager.TopBBSManager; import com.l2jserver.gameserver.communitybbs.Manager.TopicBBSManager; import com.l2jserver.gameserver.datatables.MultiSell; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.entity.TvTEvent; import com.l2jserver.gameserver.network.L2GameClient; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.ShowBoard; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; public class CommunityBoard { private CommunityBoard() { } public static CommunityBoard getInstance() { return SingletonHolder._instance; } public void handleCommands(L2GameClient client, String command) { L2PcInstance activeChar = client.getActiveChar(); if (activeChar == null) return; if(activeChar.isDead() || activeChar.isAlikeDead() || activeChar.isCastingNow() || activeChar.isInCombat() || activeChar.isAttackingNow() || activeChar.isFlying() || activeChar.isInSiege() || activeChar.isCombatFlagEquipped()) { } if(activeChar.isInJail()) { activeChar.sendMessage("\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432 \u0442\u044E\u0440\u043C\u0435."); return; } if(activeChar.isInDuel()) { activeChar.sendMessage("\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0434\u0443\u0435\u043B\u0438."); return; } if(activeChar.isInOlympiadMode()) { activeChar.sendMessage("\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u041E\u043B\u0438\u043C\u043F\u0438\u0430\u0434\u044B."); return; } if(activeChar.getPvpFlag() != 0 || activeChar.getKarma() > 0) { activeChar.sendMessage("\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C CommunityBoard \u0432 \u0442\u0430\u043A\u043E\u043C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438."); return; } if(TvTEvent.isStarted()) { activeChar.sendMessage("\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u043E \u0432\u0440\u0435\u043C\u044F TVT \u0435\u0432\u0435\u043D\u0442\u0430."); return; } if(activeChar.isInsideZone((byte)0)) { activeChar.sendMessage("\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432 \u0431\u043E\u0435\u0432\u043E\u0439 \u0437\u043E\u043D\u0435."); return; } if(activeChar.isInsideZone((byte)2)) { activeChar.sendMessage("\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432 \u0437\u043E\u043D\u0435 \u043E\u0441\u0430\u0434\u044B."); return; } switch (Config.COMMUNITY_TYPE) { default: case 0: //disabled activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CB_OFFLINE) ); break; case 1: // old RegionBBSManager.getInstance().parsecmd(command, activeChar); break; case 2: // new if (command.startsWith("_bbsclan")) { ClanBBSManager.getInstance().parsecmd(command, activeChar); } else if (command.startsWith("_bbsmemo")) { TopicBBSManager.getInstance().parsecmd(command, activeChar); } else if (command.startsWith("_bbstopics")) { TopicBBSManager.getInstance().parsecmd(command, activeChar); } else if (command.startsWith("_bbsposts")) { PostBBSManager.getInstance().parsecmd(command, activeChar); } else if (command.startsWith("_bbstop")) { TopBBSManager.getInstance().parsecmd(command, activeChar); } else if (command.startsWith("_bbshome")) { TopBBSManager.getInstance().parsecmd(command, activeChar); } else if(command.startsWith("_bbsclass")) { ClassBBSManager.getInstance().parsecmd(command, activeChar); break; } else if (command.startsWith("_bbs_buff")) { BuffBBSManager.getInstance().parsecmd(command, activeChar); } else if (command.startsWith("_bbsteleport;")) { TeleportBBSManager.getInstance().parsecmd(command, activeChar); } else if (command.startsWith("_bbsmultisell;")) { if(activeChar.isDead() || activeChar.isAlikeDead() || TvTEvent.isStarted() || activeChar.isInSiege() || activeChar.isCastingNow() || activeChar.isInCombat() || activeChar.isAttackingNow() || activeChar.isInOlympiadMode() || activeChar.isInJail() || activeChar.isFlying() || activeChar.getKarma() > 0 || activeChar.isInDuel()){ activeChar.sendMessage("В данных условиях использовать Шоп запрещено"); return; } StringTokenizer st = new StringTokenizer(command, ";"); st.nextToken(); TopBBSManager.getInstance().parsecmd("_bbstop;" + st.nextToken(), activeChar); int multisell = Integer.parseInt(st.nextToken()); MultiSell.getInstance().separateAndSend(multisell, activeChar, null, false); } else if (command.startsWith("_bbsloc")) { RegionBBSManager.getInstance().parsecmd(command, activeChar); } else { ShowBoard sb = new ShowBoard("<html><body><br><br><center>the command: " + command + " is not implemented yet</center><br><br></body></html>", "101"); activeChar.sendPacket(sb); activeChar.sendPacket(new ShowBoard(null, "102")); activeChar.sendPacket(new ShowBoard(null, "103")); } break; } } /** * @param client * @param url * @param arg1 * @param arg2 * @param arg3 * @param arg4 * @param arg5 */ public void handleWriteCommands(L2GameClient client, String url, String arg1, String arg2, String arg3, String arg4, String arg5) { L2PcInstance activeChar = client.getActiveChar(); if (activeChar == null) return; switch (Config.COMMUNITY_TYPE) { case 2: if (url.equals("Topic")) { TopicBBSManager.getInstance().parsewrite(arg1, arg2, arg3, arg4, arg5, activeChar); } else if (url.equals("Post")) { PostBBSManager.getInstance().parsewrite(arg1, arg2, arg3, arg4, arg5, activeChar); } else if (url.equals("Region")) { RegionBBSManager.getInstance().parsewrite(arg1, arg2, arg3, arg4, arg5, activeChar); } else if (url.equals("Notice")) { ClanBBSManager.getInstance().parsewrite(arg1, arg2, arg3, arg4, arg5, activeChar); } else { ShowBoard sb = new ShowBoard("<html><body><br><br><center>the command: " + url + " is not implemented yet</center><br><br></body></html>", "101"); activeChar.sendPacket(sb); activeChar.sendPacket(new ShowBoard(null, "102")); activeChar.sendPacket(new ShowBoard(null, "103")); } break; case 1: RegionBBSManager.getInstance().parsewrite(arg1, arg2, arg3, arg4, arg5, activeChar); break; default: case 0: ShowBoard sb = new ShowBoard("<html><body><br><br><center>The Community board is currently disabled</center><br><br></body></html>", "101"); activeChar.sendPacket(sb); activeChar.sendPacket(new ShowBoard(null, "102")); activeChar.sendPacket(new ShowBoard(null, "103")); break; } } @SuppressWarnings("synthetic-access") private static class SingletonHolder { protected static final CommunityBoard _instance = new CommunityBoard(); } } Убрать проверку в фаиле CommunityBoard.java или в MultiSellChoose.java?? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mr.Smith 128 Опубликовано 11 августа, 2011 Имсходники как раз есть но в CommunityBoard.javaНе нашел такого( вот моя комунка i Скрытый текстmport com.l2jserver.Config;import com.l2jserver.gameserver.communitybbs.Manager.BuffBBSManager; import com.l2jserver.gameserver.communitybbs.Manager.ClanBBSManager; import com.l2jserver.gameserver.communitybbs.Manager.ClassBBSManager; import com.l2jserver.gameserver.communitybbs.Manager.PostBBSManager; import com.l2jserver.gameserver.communitybbs.Manager.RegionBBSManager; import com.l2jserver.gameserver.communitybbs.Manager.TeleportBBSManager; import com.l2jserver.gameserver.communitybbs.Manager.TopBBSManager; import com.l2jserver.gameserver.communitybbs.Manager.TopicBBSManager; import com.l2jserver.gameserver.datatables.MultiSell; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.entity.TvTEvent; import com.l2jserver.gameserver.network.L2GameClient; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.ShowBoard; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; public class CommunityBoard { private CommunityBoard() { } public static CommunityBoard getInstance() { return SingletonHolder._instance; } public void handleCommands(L2GameClient client, String command) { L2PcInstance activeChar = client.getActiveChar(); if (activeChar == null) return; if(activeChar.isDead() || activeChar.isAlikeDead() || activeChar.isCastingNow() || activeChar.isInCombat() || activeChar.isAttackingNow() || activeChar.isFlying() || activeChar.isInSiege() || activeChar.isCombatFlagEquipped()) { } if(activeChar.isInJail()) { activeChar.sendMessage("\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432 \u0442\u044E\u0440\u043C\u0435."); return; } if(activeChar.isInDuel()) { activeChar.sendMessage("\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u0434\u0443\u0435\u043B\u0438."); return; } if(activeChar.isInOlympiadMode()) { activeChar.sendMessage("\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u043E \u0432\u0440\u0435\u043C\u044F \u041E\u043B\u0438\u043C\u043F\u0438\u0430\u0434\u044B."); return; } if(activeChar.getPvpFlag() != 0 || activeChar.getKarma() > 0) { activeChar.sendMessage("\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C CommunityBoard \u0432 \u0442\u0430\u043A\u043E\u043C \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0438."); return; } if(TvTEvent.isStarted()) { activeChar.sendMessage("\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432\u043E \u0432\u0440\u0435\u043C\u044F TVT \u0435\u0432\u0435\u043D\u0442\u0430."); return; } if(activeChar.isInsideZone((byte)0)) { activeChar.sendMessage("\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432 \u0431\u043E\u0435\u0432\u043E\u0439 \u0437\u043E\u043D\u0435."); return; } if(activeChar.isInsideZone((byte)2)) { activeChar.sendMessage("\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0432 \u0437\u043E\u043D\u0435 \u043E\u0441\u0430\u0434\u044B."); return; } switch (Config.COMMUNITY_TYPE) { default: case 0: //disabled activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CB_OFFLINE) ); break; case 1: // old RegionBBSManager.getInstance().parsecmd(command, activeChar); break; case 2: // new if (command.startsWith("_bbsclan")) { ClanBBSManager.getInstance().parsecmd(command, activeChar); } else if (command.startsWith("_bbsmemo")) { TopicBBSManager.getInstance().parsecmd(command, activeChar); } else if (command.startsWith("_bbstopics")) { TopicBBSManager.getInstance().parsecmd(command, activeChar); } else if (command.startsWith("_bbsposts")) { PostBBSManager.getInstance().parsecmd(command, activeChar); } else if (command.startsWith("_bbstop")) { TopBBSManager.getInstance().parsecmd(command, activeChar); } else if (command.startsWith("_bbshome")) { TopBBSManager.getInstance().parsecmd(command, activeChar); } else if(command.startsWith("_bbsclass")) { ClassBBSManager.getInstance().parsecmd(command, activeChar); break; } else if (command.startsWith("_bbs_buff")) { BuffBBSManager.getInstance().parsecmd(command, activeChar); } else if (command.startsWith("_bbsteleport;")) { TeleportBBSManager.getInstance().parsecmd(command, activeChar); } else if (command.startsWith("_bbsmultisell;")) { if(activeChar.isDead() || activeChar.isAlikeDead() || TvTEvent.isStarted() || activeChar.isInSiege() || activeChar.isCastingNow() || activeChar.isInCombat() || activeChar.isAttackingNow() || activeChar.isInOlympiadMode() || activeChar.isInJail() || activeChar.isFlying() || activeChar.getKarma() > 0 || activeChar.isInDuel()){ activeChar.sendMessage("В данных условиях использовать Шоп запрещено"); return; } StringTokenizer st = new StringTokenizer(command, ";"); st.nextToken(); TopBBSManager.getInstance().parsecmd("_bbstop;" + st.nextToken(), activeChar); int multisell = Integer.parseInt(st.nextToken()); MultiSell.getInstance().separateAndSend(multisell, activeChar, null, false); } else if (command.startsWith("_bbsloc")) { RegionBBSManager.getInstance().parsecmd(command, activeChar); } else { ShowBoard sb = new ShowBoard("<html><body><br><br><center>the command: " + command + " is not implemented yet</center><br><br></body></html>", "101"); activeChar.sendPacket(sb); activeChar.sendPacket(new ShowBoard(null, "102")); activeChar.sendPacket(new ShowBoard(null, "103")); } break; } } /** * @param client * @param url * @param arg1 * @param arg2 * @param arg3 * @param arg4 * @param arg5 */ public void handleWriteCommands(L2GameClient client, String url, String arg1, String arg2, String arg3, String arg4, String arg5) { L2PcInstance activeChar = client.getActiveChar(); if (activeChar == null) return; switch (Config.COMMUNITY_TYPE) { case 2: if (url.equals("Topic")) { TopicBBSManager.getInstance().parsewrite(arg1, arg2, arg3, arg4, arg5, activeChar); } else if (url.equals("Post")) { PostBBSManager.getInstance().parsewrite(arg1, arg2, arg3, arg4, arg5, activeChar); } else if (url.equals("Region")) { RegionBBSManager.getInstance().parsewrite(arg1, arg2, arg3, arg4, arg5, activeChar); } else if (url.equals("Notice")) { ClanBBSManager.getInstance().parsewrite(arg1, arg2, arg3, arg4, arg5, activeChar); } else { ShowBoard sb = new ShowBoard("<html><body><br><br><center>the command: " + url + " is not implemented yet</center><br><br></body></html>", "101"); activeChar.sendPacket(sb); activeChar.sendPacket(new ShowBoard(null, "102")); activeChar.sendPacket(new ShowBoard(null, "103")); } break; case 1: RegionBBSManager.getInstance().parsewrite(arg1, arg2, arg3, arg4, arg5, activeChar); break; default: case 0: ShowBoard sb = new ShowBoard("<html><body><br><br><center>The Community board is currently disabled</center><br><br></body></html>", "101"); activeChar.sendPacket(sb); activeChar.sendPacket(new ShowBoard(null, "102")); activeChar.sendPacket(new ShowBoard(null, "103")); break; } } @SuppressWarnings("synthetic-access") private static class SingletonHolder { protected static final CommunityBoard _instance = new CommunityBoard(); } } Убрать проверку в фаиле CommunityBoard.java или в MultiSellChoose.java?? Попробуйте ее там найти, только не спешите, покажите мне его здесь исходник.. Ах да, и скажите хроники, и ревизию сборки. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
AdminNight 0 Опубликовано 11 августа, 2011 Сборка L2jServer High Five L2J_DataPack_BETA -Revision 8271 L2J_Server_BETA-Revision 4835 Файл MultiSellChoose вот Скрытый текстpackage com.l2jserver.gameserver.network.clientpackets; import java.util.ArrayList; import java.util.logging.Logger; import javolution.util.FastList; import com.l2jserver.Config; import com.l2jserver.gameserver.datatables.MultiSell; import com.l2jserver.gameserver.model.Elementals; import com.l2jserver.gameserver.model.L2Augmentation; import com.l2jserver.gameserver.model.L2ItemInstance; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.itemcontainer.PcInventory; import com.l2jserver.gameserver.model.multisell.Entry; import com.l2jserver.gameserver.model.multisell.Ingredient; import com.l2jserver.gameserver.model.multisell.PreparedListContainer; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.ItemList; import com.l2jserver.gameserver.network.serverpackets.StatusUpdate; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; /** * The Class MultiSellChoose. */ public class MultiSellChoose extends L2GameClientPacket { private static final String _C__B0_MULTISELLCHOOSE = "[C] B0 MultiSellChoose"; private static Logger _log = Logger.getLogger(MultiSellChoose.class.getName()); private int _listId; private int _entryId; private long _amount; /*@SuppressWarnings("unused") private int _unk1; @SuppressWarnings("unused") private int _unk2; @SuppressWarnings("unused") private int _unk3; @SuppressWarnings("unused") private int _unk7; @SuppressWarnings("unused") private int _unk4; @SuppressWarnings("unused") private int _unk5; @SuppressWarnings("unused") private int _unk6; @SuppressWarnings("unused") private int _unk8; @SuppressWarnings("unused") private int _unk9; @SuppressWarnings("unused") private int _unk10; @SuppressWarnings("unused") private int _unk11;*/ @Override protected void readImpl() { _listId = readD(); _entryId = readD(); _amount = readQ(); /*_unk1 = readH(); _unk2 = readD(); _unk3 = readD(); _unk4 = readH(); // elemental attributes _unk5 = readH(); // elemental attributes _unk6 = readH(); // elemental attributes _unk7 = readH(); // elemental attributes _unk8 = readH(); // elemental attributes _unk9 = readH(); // elemental attributes _unk10 = readH(); // elemental attributes _unk11 = readH(); // elemental attributes*/ } @Override public void runImpl() { final L2PcInstance player = getClient().getActiveChar(); if (player == null) return; if (!getClient().getFloodProtectors().getMultiSell().tryPerformAction("multisell choose")) { player.setMultiSell(null); return; } if (_amount < 1 || _amount > 5000) { player.setMultiSell(null); return; } PreparedListContainer list = player.getMultiSell(); if (list == null || list.getListId() != _listId) { player.setMultiSell(null); return; } L2Npc target = player.getLastFolkNPC(); if (!player.isGM() && (target == null || !list.checkNpcObjectId(target.getObjectId()) || !target.canInteract(player))) { player.setMultiSell(null); return; } for (Entry entry : list.getEntries()) { if (entry.getEntryId() == _entryId) { if (!entry.isStackable() && _amount > 1) { _log.severe("Character: " + player.getName() + " is trying to set amount > 1 on non-stackable multisell, id:" + _listId + ":" + _entryId); player.setMultiSell(null); return; } final PcInventory inv = player.getInventory(); int slots = 0; int weight = 0; for (Ingredient e : entry.getProducts()) { if (e.getItemId() < 0) // special continue; if (!e.isStackable()) slots += e.getItemCount() * _amount; else if (player.getInventory().getItemByItemId(e.getItemId()) == null) slots++; weight += e.getItemCount() * _amount * e.getWeight(); } if (!inv.validateWeight(weight)) { player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.WEIGHT_LIMIT_EX CEEDED)); return; } if (!inv.validateCapacity(slots)) { player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.SLOTS_FULL)); return; } ArrayList<Ingredient> ingredientsList = new ArrayList<Ingredient>(entry.getIngredients().size()); // Generate a list of distinct ingredients and counts in order to check if the correct item-counts // are possessed by the player boolean newIng; for (Ingredient e : entry.getIngredients()) { newIng = true; // at this point, the template has already been modified so that enchantments are properly included // whenever they need to be applied. Uniqueness of items is thus judged by item id AND enchantment level for (int i = ingredientsList.size(); --i >= 0;) { Ingredient ex = ingredientsList.get(i); // if the item was already added in the list, merely increment the count // this happens if 1 list entry has the same ingredient twice (example 2 swords = 1 dual) if ((ex.getItemId() == e.getItemId()) && (ex.getEnchantLevel() == e.getEnchantLevel())) { if (ex.getItemCount() + e.getItemCount() > Integer.MAX_VALUE) { player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_EXCEED ED_QUANTITY_THAT_CAN_BE_INPUTTED)); return; } // two same ingredients, merge into one and replace old final Ingredient ing = ex.clone(); ing.setItemCount(ex.getItemCount() + e.getItemCount()); ingredientsList.set(i, ing); newIng = false; break; } } if (newIng) { // if it's a new ingredient, just store its info directly (item id, count, enchantment) ingredientsList.add(e); } } // now check if the player has sufficient items in the inventory to cover the ingredients' expences for (Ingredient e : ingredientsList) { if (e.getItemCount() * _amount > Integer.MAX_VALUE) { player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_EXCEED ED_QUANTITY_THAT_CAN_BE_INPUTTED)); return; } if (e.getItemId() < 0) { if (!MultiSell.checkSpecialIngredient(e.getItemId(), e.getItemCount() * _amount, player)) return; } else { // if this is not a list that maintains enchantment, check the count of all items that have the given id. // otherwise, check only the count of items with exactly the needed enchantment level final long required = ((Config.ALT_BLACKSMITH_USE_RECIPES || !e.getMaintainIngredient()) ? (e.getItemCount() * _amount) : e.getItemCount()); if (inv.getInventoryItemCount(e.getItemId(), list.getMaintainEnchantment() ? e.getEnchantLevel() : -1, false) < required) { SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S2_UNIT_OF_THE_ITEM_S1_REQUIRED); sm.addItemName(e.getTemplate()); sm.addNumber((int)required); player.sendPacket(sm); return; } } } FastList<L2Augmentation> augmentation = FastList.newInstance(); Elementals[] elemental = null; /** All ok, remove items and add final product */ try { for (Ingredient e : entry.getIngredients()) { if (e.getItemId() < 0) { if (!MultiSell.getSpecialIngredient(e.getItemId(), e.getItemCount() * _amount, player)) return; } else { L2ItemInstance itemToTake = inv.getItemByItemId(e.getItemId()); // initialize and initial guess for the item to take. if (itemToTake == null) { //this is a cheat, transaction will be aborted and if any items already taken will not be returned back to inventory! _log.severe("Character: " + player.getName() + " is trying to cheat in multisell, id:" + _listId + ":" + _entryId); player.setMultiSell(null); return; } /*if (itemToTake.isEquipped()) { //this is a cheat, transaction will be aborted and if any items already taken will not be returned back to inventory! _log.severe("Character: " + player.getName() + " is trying to cheat in multisell, exchanging equipped item, merchatnt id:" + merchant.getNpcId()); player.setMultiSell(null); return; }*/ if (Config.ALT_BLACKSMITH_USE_RECIPES || !e.getMaintainIngredient()) { // if it's a stackable item, just reduce the amount from the first (only) instance that is found in the inventory if (itemToTake.isStackable()) { if (!player.destroyItem("Multisell", itemToTake.getObjectId(), (e.getItemCount() * _amount), player.getTarget(), true)) { player.setMultiSell(null); return; } } else { // for non-stackable items, one of two scenaria are possible: // a) list maintains enchantment: get the instances that exactly match the requested enchantment level // list does not maintain enchantment: get the instances with the LOWEST enchantment level // a) if enchantment is maintained, then get a list of items that exactly match this enchantment if (list.getMaintainEnchantment()) { // loop through this list and remove (one by one) each item until the required amount is taken. L2ItemInstance[] inventoryContents = inv.getAllItemsByItemId(e.getItemId(), e.getEnchantLevel(), false); for (int i = 0; i < (e.getItemCount() * _amount); i++) { if (inventoryContents.isAugmented()) augmentation.add(inventoryContents.getAugmentation()); if(inventoryContents.getElementals() != null) elemental = inventoryContents.getElementals(); if (!player.destroyItem("Multisell", inventoryContents.getObjectId(), 1, player.getTarget(), true)) { player.setMultiSell(null); return; } } } else // enchantment is not maintained. Get the instances with the LOWEST enchantment level { /* NOTE: There are 2 ways to achieve the above goal. * 1) Get all items that have the correct itemId, loop through them until the lowest enchantment * level is found. Repeat all this for the next item until proper count of items is reached. * 2) Get all items that have the correct itemId, sort them once based on enchantment level, * and get the range of items that is necessary. * Method 1 is faster for a small number of items to be exchanged. * Method 2 is faster for large amounts. * * EXPLANATION: * Worst case scenario for algorithm 1 will make it run in a number of cycles given by: * m*(2n-m+1)/2 where m is the number of items to be exchanged and n is the total * number of inventory items that have a matching id. * With algorithm 2 (sort), sorting takes n*log(n) time and the choice is done in a single cycle * for case b (just grab the m first items) or in linear time for case a (find the beginning of items * with correct enchantment, index x, and take all items from x to x+m). * Basically, whenever m > log(n) we have: m*(2n-m+1)/2 = (2nm-m*m+m)/2 > * (2nlogn-logn*logn+logn)/2 = nlog(n) - log(n*n) + log(n) = nlog(n) + log(n/n*n) = * nlog(n) + log(1/n) = nlog(n) - log(n) = (n-1)log(n) * So for m < log(n) then m*(2n-m+1)/2 > (n-1)log(n) and m*(2n-m+1)/2 > nlog(n) * * IDEALLY: * In order to best optimize the performance, choose which algorithm to run, based on whether 2^m > n * if ( (2<<(e.getItemCount() * _amount)) < inventoryContents.length ) * // do Algorithm 1, no sorting * else * // do Algorithm 2, sorting * * CURRENT IMPLEMENTATION: * In general, it is going to be very rare for a person to do a massive exchange of non-stackable items * For this reason, we assume that algorithm 1 will always suffice and we keep things simple. * If, in the future, it becomes necessary that we optimize, the above discussion should make it clear * what optimization exactly is necessary (based on the comments under "IDEALLY"). */ // choice 1. Small number of items exchanged. No sorting. for (int i = 1; i <= (e.getItemCount() * _amount); i++) { L2ItemInstance[] inventoryContents = inv.getAllItemsByItemId(e.getItemId(), false); itemToTake = inventoryContents[0]; // get item with the LOWEST enchantment level from the inventory... // +0 is lowest by default... if (itemToTake.getEnchantLevel() > 0) { for (L2ItemInstance item : inventoryContents) { if (item.getEnchantLevel() < itemToTake.getEnchantLevel()) { itemToTake = item; // nothing will have enchantment less than 0. If a zero-enchanted // item is found, just take it if (itemToTake.getEnchantLevel() == 0) break; } } } if (!player.destroyItem("Multisell", itemToTake.getObjectId(), 1, player.getTarget(), true)) { player.setMultiSell(null); return; } } } } } } } // Generate the appropriate items for (Ingredient e : entry.getProducts()) { if (e.getItemId() < 0) { MultiSell.addSpecialProduct(e.getItemId(), e.getItemCount() * _amount, player); } else { if (e.isStackable()) inv.addItem("Multisell", e.getItemId(), e.getItemCount() * _amount, player, player.getTarget()); else { L2ItemInstance product = null; for (int i = 0; i < (e.getItemCount() * _amount); i++) { product = inv.addItem("Multisell", e.getItemId(), 1, player, player.getTarget()); if (list.getMaintainEnchantment()) { if (i < augmentation.size()) product.setAugmentation(new L2Augmentation(augmentation.get(i).getAugmentationId(), augmentation.get(i).getSkill())); if (elemental != null) for (Elementals elm : elemental) product.setElementAttr(elm.getElement(), elm.getValue()); product.setEnchantLevel(e.getEnchantLevel()); product.updateDatabase(); } } } // msg part SystemMessage sm; if (e.getItemCount() * _amount > 1) { sm = SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S); sm.addItemName(e.getItemId()); sm.addItemNumber(e.getItemCount() * _amount); player.sendPacket(sm); sm = null; } else { if (list.getMaintainEnchantment() && e.getEnchantLevel() > 0) { sm = SystemMessage.getSystemMessage(SystemMessageId.ACQUIRED_S1_S2); sm.addItemNumber(e.getEnchantLevel()); sm.addItemName(e.getItemId()); } else { sm = SystemMessage.getSystemMessage(SystemMessageId.EARNED_ITEM_S1); sm.addItemName(e.getItemId()); } player.sendPacket(sm); sm = null; } } } player.sendPacket(new ItemList(player, false)); StatusUpdate su = new StatusUpdate(player); su.addAttribute(StatusUpdate.CUR_LOAD, player.getCurrentLoad()); player.sendPacket(su); su = null; } finally { FastList.recycle(augmentation); } // finally, give the tax to the castle... if (entry.getTaxAmount() > 0) target.getCastle().addToTreasury(entry.getTaxAmount() * _amount); break; } } } @Override public String getType() { return _C__B0_MULTISELLCHOOSE; } } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mr.Smith 128 Опубликовано 11 августа, 2011 Сборка L2jServer High FiveL2J_DataPack_BETA -Revision 8271 L2J_Server_BETA-Revision 4835 Файл MultiSellChoose вот Скрытый текстpackage com.l2jserver.gameserver.network.clientpackets; import java.util.ArrayList; import java.util.logging.Logger; import javolution.util.FastList; import com.l2jserver.Config; import com.l2jserver.gameserver.datatables.MultiSell; import com.l2jserver.gameserver.model.Elementals; import com.l2jserver.gameserver.model.L2Augmentation; import com.l2jserver.gameserver.model.L2ItemInstance; import com.l2jserver.gameserver.model.actor.L2Npc; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.itemcontainer.PcInventory; import com.l2jserver.gameserver.model.multisell.Entry; import com.l2jserver.gameserver.model.multisell.Ingredient; import com.l2jserver.gameserver.model.multisell.PreparedListContainer; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.ItemList; import com.l2jserver.gameserver.network.serverpackets.StatusUpdate; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; /** * The Class MultiSellChoose. */ public class MultiSellChoose extends L2GameClientPacket { private static final String _C__B0_MULTISELLCHOOSE = "[C] B0 MultiSellChoose"; private static Logger _log = Logger.getLogger(MultiSellChoose.class.getName()); private int _listId; private int _entryId; private long _amount; /*@SuppressWarnings("unused") private int _unk1; @SuppressWarnings("unused") private int _unk2; @SuppressWarnings("unused") private int _unk3; @SuppressWarnings("unused") private int _unk7; @SuppressWarnings("unused") private int _unk4; @SuppressWarnings("unused") private int _unk5; @SuppressWarnings("unused") private int _unk6; @SuppressWarnings("unused") private int _unk8; @SuppressWarnings("unused") private int _unk9; @SuppressWarnings("unused") private int _unk10; @SuppressWarnings("unused") private int _unk11;*/ @Override protected void readImpl() { _listId = readD(); _entryId = readD(); _amount = readQ(); /*_unk1 = readH(); _unk2 = readD(); _unk3 = readD(); _unk4 = readH(); // elemental attributes _unk5 = readH(); // elemental attributes _unk6 = readH(); // elemental attributes _unk7 = readH(); // elemental attributes _unk8 = readH(); // elemental attributes _unk9 = readH(); // elemental attributes _unk10 = readH(); // elemental attributes _unk11 = readH(); // elemental attributes*/ } @Override public void runImpl() { final L2PcInstance player = getClient().getActiveChar(); if (player == null) return; if (!getClient().getFloodProtectors().getMultiSell().tryPerformAction("multisell choose")) { player.setMultiSell(null); return; } if (_amount < 1 || _amount > 5000) { player.setMultiSell(null); return; } PreparedListContainer list = player.getMultiSell(); if (list == null || list.getListId() != _listId) { player.setMultiSell(null); return; } L2Npc target = player.getLastFolkNPC(); if (!player.isGM() && ( Вот эту часть удалите, и попробуйте, должно все работать, но не факт.target == null || !list.checkNpcObjectId(target.getObjectId()) || !target.canInteract(player))) { player.setMultiSell(null); return; } for (Entry entry : list.getEntries()) { if (entry.getEntryId() == _entryId) { if (!entry.isStackable() && _amount > 1) { _log.severe("Character: " + player.getName() + " is trying to set amount > 1 on non-stackable multisell, id:" + _listId + ":" + _entryId); player.setMultiSell(null); return; } final PcInventory inv = player.getInventory(); int slots = 0; int weight = 0; for (Ingredient e : entry.getProducts()) { if (e.getItemId() < 0) // special continue; if (!e.isStackable()) slots += e.getItemCount() * _amount; else if (player.getInventory().getItemByItemId(e.getItemId()) == null) slots++; weight += e.getItemCount() * _amount * e.getWeight(); } if (!inv.validateWeight(weight)) { player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.WEIGHT_LIMIT_EX CEEDED)); return; } if (!inv.validateCapacity(slots)) { player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.SLOTS_FULL)); return; } ArrayList<Ingredient> ingredientsList = new ArrayList<Ingredient>(entry.getIngredients().size()); // Generate a list of distinct ingredients and counts in order to check if the correct item-counts // are possessed by the player boolean newIng; for (Ingredient e : entry.getIngredients()) { newIng = true; // at this point, the template has already been modified so that enchantments are properly included // whenever they need to be applied. Uniqueness of items is thus judged by item id AND enchantment level for (int i = ingredientsList.size(); --i >= 0;) { Ingredient ex = ingredientsList.get(i); // if the item was already added in the list, merely increment the count // this happens if 1 list entry has the same ingredient twice (example 2 swords = 1 dual) if ((ex.getItemId() == e.getItemId()) && (ex.getEnchantLevel() == e.getEnchantLevel())) { if (ex.getItemCount() + e.getItemCount() > Integer.MAX_VALUE) { player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_EXCEED ED_QUANTITY_THAT_CAN_BE_INPUTTED)); return; } // two same ingredients, merge into one and replace old final Ingredient ing = ex.clone(); ing.setItemCount(ex.getItemCount() + e.getItemCount()); ingredientsList.set(i, ing); newIng = false; break; } } if (newIng) { // if it's a new ingredient, just store its info directly (item id, count, enchantment) ingredientsList.add(e); } } // now check if the player has sufficient items in the inventory to cover the ingredients' expences for (Ingredient e : ingredientsList) { if (e.getItemCount() * _amount > Integer.MAX_VALUE) { player.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOU_HAVE_EXCEED ED_QUANTITY_THAT_CAN_BE_INPUTTED)); return; } if (e.getItemId() < 0) { if (!MultiSell.checkSpecialIngredient(e.getItemId(), e.getItemCount() * _amount, player)) return; } else { // if this is not a list that maintains enchantment, check the count of all items that have the given id. // otherwise, check only the count of items with exactly the needed enchantment level final long required = ((Config.ALT_BLACKSMITH_USE_RECIPES || !e.getMaintainIngredient()) ? (e.getItemCount() * _amount) : e.getItemCount()); if (inv.getInventoryItemCount(e.getItemId(), list.getMaintainEnchantment() ? e.getEnchantLevel() : -1, false) < required) { SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S2_UNIT_OF_THE_ITEM_S1_REQUIRED); sm.addItemName(e.getTemplate()); sm.addNumber((int)required); player.sendPacket(sm); return; } } } FastList<L2Augmentation> augmentation = FastList.newInstance(); Elementals[] elemental = null; /** All ok, remove items and add final product */ try { for (Ingredient e : entry.getIngredients()) { if (e.getItemId() < 0) { if (!MultiSell.getSpecialIngredient(e.getItemId(), e.getItemCount() * _amount, player)) return; } else { L2ItemInstance itemToTake = inv.getItemByItemId(e.getItemId()); // initialize and initial guess for the item to take. if (itemToTake == null) { //this is a cheat, transaction will be aborted and if any items already taken will not be returned back to inventory! _log.severe("Character: " + player.getName() + " is trying to cheat in multisell, id:" + _listId + ":" + _entryId); player.setMultiSell(null); return; } /*if (itemToTake.isEquipped()) { //this is a cheat, transaction will be aborted and if any items already taken will not be returned back to inventory! _log.severe("Character: " + player.getName() + " is trying to cheat in multisell, exchanging equipped item, merchatnt id:" + merchant.getNpcId()); player.setMultiSell(null); return; }*/ if (Config.ALT_BLACKSMITH_USE_RECIPES || !e.getMaintainIngredient()) { // if it's a stackable item, just reduce the amount from the first (only) instance that is found in the inventory if (itemToTake.isStackable()) { if (!player.destroyItem("Multisell", itemToTake.getObjectId(), (e.getItemCount() * _amount), player.getTarget(), true)) { player.setMultiSell(null); return; } } else { // for non-stackable items, one of two scenaria are possible: // a) list maintains enchantment: get the instances that exactly match the requested enchantment level // list does not maintain enchantment: get the instances with the LOWEST enchantment level // a) if enchantment is maintained, then get a list of items that exactly match this enchantment if (list.getMaintainEnchantment()) { // loop through this list and remove (one by one) each item until the required amount is taken. L2ItemInstance[] inventoryContents = inv.getAllItemsByItemId(e.getItemId(), e.getEnchantLevel(), false); for (int i = 0; i < (e.getItemCount() * _amount); i++) { if (inventoryContents.isAugmented()) augmentation.add(inventoryContents.getAugmentation()); if(inventoryContents.getElementals() != null) elemental = inventoryContents.getElementals(); if (!player.destroyItem("Multisell", inventoryContents.getObjectId(), 1, player.getTarget(), true)) { player.setMultiSell(null); return; } } } else // enchantment is not maintained. Get the instances with the LOWEST enchantment level { /* NOTE: There are 2 ways to achieve the above goal. * 1) Get all items that have the correct itemId, loop through them until the lowest enchantment * level is found. Repeat all this for the next item until proper count of items is reached. * 2) Get all items that have the correct itemId, sort them once based on enchantment level, * and get the range of items that is necessary. * Method 1 is faster for a small number of items to be exchanged. * Method 2 is faster for large amounts. * * EXPLANATION: * Worst case scenario for algorithm 1 will make it run in a number of cycles given by: * m*(2n-m+1)/2 where m is the number of items to be exchanged and n is the total * number of inventory items that have a matching id. * With algorithm 2 (sort), sorting takes n*log(n) time and the choice is done in a single cycle * for case b (just grab the m first items) or in linear time for case a (find the beginning of items * with correct enchantment, index x, and take all items from x to x+m). * Basically, whenever m > log(n) we have: m*(2n-m+1)/2 = (2nm-m*m+m)/2 > * (2nlogn-logn*logn+logn)/2 = nlog(n) - log(n*n) + log(n) = nlog(n) + log(n/n*n) = * nlog(n) + log(1/n) = nlog(n) - log(n) = (n-1)log(n) * So for m < log(n) then m*(2n-m+1)/2 > (n-1)log(n) and m*(2n-m+1)/2 > nlog(n) * * IDEALLY: * In order to best optimize the performance, choose which algorithm to run, based on whether 2^m > n * if ( (2<<(e.getItemCount() * _amount)) < inventoryContents.length ) * // do Algorithm 1, no sorting * else * // do Algorithm 2, sorting * * CURRENT IMPLEMENTATION: * In general, it is going to be very rare for a person to do a massive exchange of non-stackable items * For this reason, we assume that algorithm 1 will always suffice and we keep things simple. * If, in the future, it becomes necessary that we optimize, the above discussion should make it clear * what optimization exactly is necessary (based on the comments under "IDEALLY"). */ // choice 1. Small number of items exchanged. No sorting. for (int i = 1; i <= (e.getItemCount() * _amount); i++) { L2ItemInstance[] inventoryContents = inv.getAllItemsByItemId(e.getItemId(), false); itemToTake = inventoryContents[0]; // get item with the LOWEST enchantment level from the inventory... // +0 is lowest by default... if (itemToTake.getEnchantLevel() > 0) { for (L2ItemInstance item : inventoryContents) { if (item.getEnchantLevel() < itemToTake.getEnchantLevel()) { itemToTake = item; // nothing will have enchantment less than 0. If a zero-enchanted // item is found, just take it if (itemToTake.getEnchantLevel() == 0) break; } } } if (!player.destroyItem("Multisell", itemToTake.getObjectId(), 1, player.getTarget(), true)) { player.setMultiSell(null); return; } } } } } } } // Generate the appropriate items for (Ingredient e : entry.getProducts()) { if (e.getItemId() < 0) { MultiSell.addSpecialProduct(e.getItemId(), e.getItemCount() * _amount, player); } else { if (e.isStackable()) inv.addItem("Multisell", e.getItemId(), e.getItemCount() * _amount, player, player.getTarget()); else { L2ItemInstance product = null; for (int i = 0; i < (e.getItemCount() * _amount); i++) { product = inv.addItem("Multisell", e.getItemId(), 1, player, player.getTarget()); if (list.getMaintainEnchantment()) { if (i < augmentation.size()) product.setAugmentation(new L2Augmentation(augmentation.get(i).getAugmentationId(), augmentation.get(i).getSkill())); if (elemental != null) for (Elementals elm : elemental) product.setElementAttr(elm.getElement(), elm.getValue()); product.setEnchantLevel(e.getEnchantLevel()); product.updateDatabase(); } } } // msg part SystemMessage sm; if (e.getItemCount() * _amount > 1) { sm = SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S); sm.addItemName(e.getItemId()); sm.addItemNumber(e.getItemCount() * _amount); player.sendPacket(sm); sm = null; } else { if (list.getMaintainEnchantment() && e.getEnchantLevel() > 0) { sm = SystemMessage.getSystemMessage(SystemMessageId.ACQUIRED_S1_S2); sm.addItemNumber(e.getEnchantLevel()); sm.addItemName(e.getItemId()); } else { sm = SystemMessage.getSystemMessage(SystemMessageId.EARNED_ITEM_S1); sm.addItemName(e.getItemId()); } player.sendPacket(sm); sm = null; } } } player.sendPacket(new ItemList(player, false)); StatusUpdate su = new StatusUpdate(player); su.addAttribute(StatusUpdate.CUR_LOAD, player.getCurrentLoad()); player.sendPacket(su); su = null; } finally { FastList.recycle(augmentation); } // finally, give the tax to the castle... if (entry.getTaxAmount() > 0) target.getCastle().addToTreasury(entry.getTaxAmount() * _amount); break; } } } @Override public String getType() { return _C__B0_MULTISELLCHOOSE; } } В коде красным выделено что нужно удалить, и не забудьте ядро перекомпилировать. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
AdminNight 0 Опубликовано 11 августа, 2011 не помогло ( Удалил то что ты отметил красным. Захожу в игру нажимаю купить ,не че не происходит вообще. (скомпилить исходники не забыл!) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mr.Smith 128 Опубликовано 11 августа, 2011 не помогло (Удалил то что ты отметил красным. Захожу в игру нажимаю купить ,не че не происходит вообще. (скомпилить исходники не забыл!) Тогда скорее всего, что где то стоит проверка выведеная на конфиг, и она включена, ищите в конфигах, больше ее не где не может, быть, я как слепой с вами общаюсь, не рук не чего вообще, вообщем поищите конфиг, и если не получится что либо решить с данной проблемой, напишите мне завтро в ЛС после обеда, и я через TW уберу эту проверку, а то так можно годать сколько угодно пожалуй, спокойной, и удачи. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
AdminNight 0 Опубликовано 13 августа, 2011 Кто может помочь с Community гм-шопом через TW ? не могу разобратся, как сделать чтобы обычным игроком можно было покупать. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
AdminNight 0 Опубликовано 13 августа, 2011 Тему Closed . Разобрался. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
SmokiMo 892 Опубликовано 25 сентября, 2012 <strong class='bbc'>Автоматическое сообщение</strong><br /><br /><br />Эта тема была перемещена из "Форум для новичков" в "Решенные проблемы". Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты