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 AdminNight сказал: Ты просветил)Оно у меня реализовано все работает кроме гм шопа . В комунити гм шопе могут покупать ток админы вот в чем прикол! Нужно убрать проверку 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 AdminNight сказал: Имсходники как раз есть но в 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 AdminNight сказал: Сборка 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 AdminNight сказал: не помогло (Удалил то что ты отметил красным. Захожу в игру нажимаю купить ,не че не происходит вообще. (скомпилить исходники не забыл!) Тогда скорее всего, что где то стоит проверка выведеная на конфиг, и она включена, ищите в конфигах, больше ее не где не может, быть, я как слепой с вами общаюсь, не рук не чего вообще, вообщем поищите конфиг, и если не получится что либо решить с данной проблемой, напишите мне завтро в ЛС после обеда, и я через TW уберу эту проверку, а то так можно годать сколько угодно пожалуй, спокойной, и удачи. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
AdminNight 0 Опубликовано 13 августа, 2011 Кто может помочь с Community гм-шопом через TW ? не могу разобратся, как сделать чтобы обычным игроком можно было покупать. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
AdminNight 0 Опубликовано 13 августа, 2011 Тему Closed . Разобрался. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
SmokiMo 892 Опубликовано 25 сентября, 2012 <strong class='bbc'>Автоматическое сообщение</strong><br /><br /><br />Эта тема была перемещена из "Форум для новичков" в "Решенные проблемы". Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты