[овероподобные] Фикс дюпа на фортах

Enmity

Гений мысли
Проверенный
Победитель в номинации 2017
За знание ядра
Почетный знак Модератора (III степени)
Победитель в номинации 2016
За заслуги перед форумом
Медаль за активность на Форуме
Разработчик
Сообщения
1 707
Розыгрыши
0
Репутация
2 909
Реакции
1 688
Баллы
1 843
[USERSID=] [/USERSID]когда-то в давние времена, чуть позже шары сурсов фт, Гринд зашарил на форуме фт фикс этого дюпа.

времени прошло много, форум фт уже пал смертью храбрых, но фикс особо в паблике не появлялся.

ps: хайд от лампы. если кому-то нужно и вы не только что зарегались - пишите в личку, дам личный. тупо защита от личинга дебилами-новорегами, хоть они зачастую и обитают в разделе халявных пдсх и тап дизигнов.

кидать сюда

3ebb1-clip-17kb.png


Код:
//====================пофикшено в [А по щам?] знает какие времена Гриндом.
//====================первое появление - forum first-team.

public class LogisticsOfficerInstance extends FacilityManagerInstance
{
    private static final int[] SUPPLY_NPC = new int[]
    {
        35665,
        35697,
        35734,
        35766,
        35803,
        35834
    };

    private static final int ITEM_ID = 9910; // Blood Oath
    public LogisticsOfficerInstance(int objectId, NpcTemplate template)
    {
        super(objectId, template);
    }
    @Override
    public void onBypassFeedback(Player player, String command)
    {
        if(!canBypassCheck(player, this))
            return;
        Fortress fortress = getFortress();
        if(!player.isClanLeader() || fortress.getOwnerId() != player.getClanId())
        {
            showChatWindow(player, "residence2/fortress/fortress_not_authorized.htm");
            return;
        }
        if(command.equalsIgnoreCase("guardInfo"))
        {
            if(fortress.getContractState() != Fortress.CONTRACT_WITH_CASTLE)
            {
                showChatWindow(player, "residence2/fortress/fortress_supply_officer005.htm");
                return;
            }
            showChatWindow(player, "residence2/fortress/fortress_supply_officer002.htm", "%guard_buff_level%", fortress.getFacilityLevel(Fortress.GUARD_BUFF));
        }
        else if(command.equalsIgnoreCase("supplyInfo"))
        {
            if(fortress.getContractState() != Fortress.CONTRACT_WITH_CASTLE)
            {
                showChatWindow(player, "residence2/fortress/fortress_supply_officer005.htm");
                return;
            }
            showChatWindow(player, "residence2/fortress/fortress_supply_officer009.htm", "%supply_count%", fortress.getSupplyCount());
        }
        else if(command.equalsIgnoreCase("rewardInfo"))
        {
            showChatWindow(player, "residence2/fortress/fortress_supply_officer010.htm", "%blood_oaths%", fortress.getRewardCount());
        }
        else if(command.equalsIgnoreCase("receiveSupply"))
        {
            String filename;
            if(fortress.getSupplyCount() > 0)
            {
                if(player.getVar("FortSupply") != null)
                {
                    if(player.getVarLong("FortSupply") > System.currentTimeMillis())
                    {
                        player.sendMessage(player.isLangRus() ? "Данное действие доступно 1-н раз в 6 часов." : "This action is available 1-n every 6 hours.");
                        return;
                    }
                }
                player.setVar("FortSupply", System.currentTimeMillis() + 21600000, -1);
                filename = "residence2/fortress/fortress_supply_officer016.htm";
                NpcInstance npc = NpcHolder.getInstance().getTemplate(SUPPLY_NPC[fortress.getSupplyCount() - 1]).getNewInstance();
                npc.setCurrentHpMp(npc.getMaxHp(), npc.getMaxMp());
                npc.spawnMe(new Location(getX() - 23, getY() + 41, getZ()));
            }
            else
                filename ="residence2/fortress/fortress_supply_officer017.htm";
            NpcHtmlMessage html = new NpcHtmlMessage(player, this);
            html.setFile(filename);
            player.sendPacket(html);
        }
        else if(command.equalsIgnoreCase("receiveRewards"))
        {
            String filename;
            int count = fortress.getRewardCount();
            if(count > 0)
            {
                filename = "residence2/fortress/fortress_supply_officer013.htm";
                fortress.setRewardCount(0);
                fortress.setJdbcState(JdbcEntityState.UPDATED);
                fortress.update();
                Functions.addItem(player, ITEM_ID, count);
            }
            else
                filename ="residence2/fortress/fortress_supply_officer014.htm";
            NpcHtmlMessage html = new NpcHtmlMessage(player, this);
            html.setFile(filename);
            player.sendPacket(html);
        }
        else if(command.equalsIgnoreCase("toLevel1"))
            buyFacility(player, Fortress.GUARD_BUFF, 1, 100000);
        else if(command.equalsIgnoreCase("toLevel2"))
            buyFacility(player, Fortress.GUARD_BUFF, 2, 150000);
        else
            super.onBypassFeedback(player, command);
    }
    @Override
    public void showChatWindow(Player player, int val, Object... arg)
    {
        showChatWindow(player, "residence2/fortress/fortress_supply_officer001.htm");
    }
}



ps:
 
Последнее редактирование модератором:
Последнее редактирование:
Эм... Сравнил файл с первым попавшимся из гугла. Фикс это player.setVar("FortSupply")? Так же можно БД изнасиловать:)
Да и к тому же, в вар третье значение отвечает за срок действия переменной, смысл так извращаться?
 
Эм... Сравнил файл с первым попавшимся из гугла. Фикс это player.setVar("FortSupply")? Так же можно БД изнасиловать:)
Да и к тому же, в вар третье значение отвечает за срок действия переменной, смысл так извращаться?
изнасиловать бд тем, чем пользуются раз 4 раза в день ~15 человек на сервере? :D
 
Эм... Сравнил файл с первым попавшимся из гугла. Фикс это player.setVar("FortSupply")? Так же можно БД изнасиловать:)
Да и к тому же, в вар третье значение отвечает за срок действия переменной, смысл так извращаться?

оригинал, вытащил с трэка
 
изнасиловать бд тем, чем пользуются раз 4 раза в день ~15 человек на сервере? :D
Сори, мне казалось, что в какой-то сборке getVar напрямую из БД брал значение=) Но все равно, за жизнь переменной отвечает третье значение=)
 
Сори, мне казалось, что в какой-то сборке getVar напрямую из БД брал значение:) Но все равно, за жизнь переменной отвечает третье значение:)
надо, кстати, посмотреть. мне тоже кажется что из character_variables дёргает.

хотя и смотреть не надо, логично.
 
надо, кстати, посмотреть. мне тоже кажется что из character_variables дёргает.

хотя и смотреть не надо, логично.
Ух... Сейчас посмотрел код этих переменных у себя, знал что надо переделать + допилить, но не знал, что настолько=) У меня кроме unsetVar нигде нету удаление истёкших переменных. Подшаманим сейчас=)
 
Grind Team

Гринд гавнокодер которого не стоит использовать фиксы и даже наработки
 
не столь важно. по факту фикс есть.
Мое мнение, лучше было бы запилить коллекцию в самом LogisticsOfficerInstance с обджИд чара и временем, а для неё можно и таблицу в бд выделить, чтобы туда писать при выключении сервера и читать при загрузке, а не нагружать и без того громадную таблицу character_variables.
 
надо, кстати, посмотреть. мне тоже кажется что из character_variables дёргает.

хотя и смотреть не надо, логично.
а чо, такие сборки еще есть где при каждом запросе переменной, ее считывает заново из бд о_О
да там же первым делом по моему все, кто хоть сколько-то соображают, грузят переменные один раз в память - при входе в игру персонажа и уже с этими переменными и работают, а в бд лезут только при unsetVar и setVar. И то при втором только когда реально изменилось значение, а не прилетело то же самое что и было.

З.Ы. а дюп лечится по другому и проще. и никаким местом там переменные персов не задействованы.
 
  • Мне нравится
Реакции: kick
а чо, такие сборки еще есть где при каждом запросе переменной, ее считывает заново из бд о_О
да там же первым делом по моему все, кто хоть сколько-то соображают, грузят переменные один раз в память - при входе в игру персонажа и уже с этими переменными и работают, а в бд лезут только при unsetVar и setVar. И то при втором только когда реально изменилось значение, а не прилетело то же самое что и было.

З.Ы. а дюп лечится по другому и проще. и никаким местом там переменные персов не задействованы.
Я точно видел такую сборку, т.к. в голове это засело у меня не просто так.

З.Ы. Хотелось бы посмотреть варианты фиксов.
 
Форт по-человечески писать надо бы, чтобы он производит итем себе 1 раз в 6 часов если форт захвачен. А какой конкретно чар будет забирать его - не суть важно.
В лостворде тоже такая же ботва?
 
Последнее редактирование:
Форт по-человечески писать надо бы, чтобы он производит итем себе 1 раз в 6 часов если форт захвачен. А какой конкретно чар будет забирать его - не суть важно.
В лостворде тоже такая же ботва?
Нет. Если вам хочется гавнокодить и срать с вашими варами держите:
Код:
        else if(command.equalsIgnoreCase("receiveSupply"))
        {
            String filename;
            if(fortress.getSupplyCount() > 0 && player.getVar("supplyBox") == null)
            {
                filename = "residence2/fortress/fortress_supply_officer016.htm";

                NpcInstance npc = NpcHolder.getInstance().getTemplate(SUPPLY_NPC[fortress.getSupplyCount() - 1]).getNewInstance();
                npc.setCurrentHpMp(npc.getMaxHp(), npc.getMaxMp());
                npc.spawnMe(new Location(getX() - 23, getY() + 41, getZ()));
                player.setVar("supplyBox", "LogisticsOfficerFort", 43200000);
            }
            else
                filename ="residence2/fortress/fortress_supply_officer017.htm";

            NpcHtmlMessage html = new NpcHtmlMessage(player, this);
            html.setFile(filename);
            player.sendPacket(html);
        }
Всё так трудно заговнокодить. Дошло через 4 года, что там есть дюп. Но это не фикс это так же бред.

Ведь в ядре есть чудесный метод

public void setSupplyCount(int c)
{
_supplyCount = c;
}

Код:
       else if(command.equalsIgnoreCase("receiveSupply"))
        {
            String filename;
            if(fortress.getSupplyCount() > 0)
            {
                filename = "residence2/fortress/fortress_supply_officer016.htm";

                NpcInstance npc = NpcHolder.getInstance().getTemplate(SUPPLY_NPC[fortress.getSupplyCount() - 1]).getNewInstance();
                npc.setCurrentHpMp(npc.getMaxHp(), npc.getMaxMp());
                npc.spawnMe(new Location(getX() - 23, getY() + 41, getZ()));
            }
            else
                filename ="residence2/fortress/fortress_supply_officer017.htm";

            NpcHtmlMessage html = new NpcHtmlMessage(player, this);
            html.setFile(filename);
            player.sendPacket(html);
        }

Код:
       else if(command.equalsIgnoreCase("receiveSupply"))
        {
            String filename;
            if(fortress.getSupplyCount() > 0)
            {
                filename = "residence2/fortress/fortress_supply_officer016.htm";

                NpcInstance npc = NpcHolder.getInstance().getTemplate(SUPPLY_NPC[fortress.getSupplyCount() - 1]).getNewInstance();
                npc.setCurrentHpMp(npc.getMaxHp(), npc.getMaxMp());
                npc.spawnMe(new Location(getX() - 23, getY() + 41, getZ()));
               
                fortress.setSupplyCount(0);
                fortress.setJdbcState(JdbcEntityState.UPDATED);
                fortress.update();
            }
            else
                filename ="residence2/fortress/fortress_supply_officer017.htm";

            NpcHtmlMessage html = new NpcHtmlMessage(player, this);
            html.setFile(filename);
            player.sendPacket(html);
        }
Огромный просто фикс. Зачем говно кодить то? Всё просто и понятно как это можно исправить. Но не как не вариант с варами это просто идиотство и к тому же в ядре с фортом давно это было установлено
Код:
@Override
    public void chanceCycle()
    {
        super.chanceCycle();
        if(getCycle() >= REMOVE_CYCLE)
        {
            getOwner().broadcastToOnlineMembers(SystemMsg.ENEMY_BLOOD_PLEDGES_HAVE_INTRUDED_INTO_THE_FORTRESS);
            changeOwner(null);
            return;
        }

        setPaidCycle(getPaidCycle() + 1);
        // если кратно REWARD_CYCLE то добавляем ревард
        if(getPaidCycle() >= REWARD_CYCLE)
        {
            setPaidCycle(0);
            setRewardCount(getRewardCount() + 1);

            if(getContractState() == CONTRACT_WITH_CASTLE)
            {
                Castle castle = ResidenceHolder.getInstance().getResidence(Castle.class, _castleId);
                if(castle.getOwner() == null || castle.getOwner().getReputationScore() < 2 || _owner.getWarehouse().getCountOf(ItemTemplate.ITEM_ID_ADENA) > CASTLE_FEE)
                {
                    setSupplyCount(0);
                    setFortState(INDEPENDENT, 0);
                    clearFacility();
                }
                else
                {
                    if(_supplyCount < 6)
                    {
                        _supplyCount++;
                    }

                    castle.getOwner().incReputation(-2, false, "Fortress:chanceCycle():" + getId());
                    _owner.getWarehouse().destroyItemByItemId(ItemTemplate.ITEM_ID_ADENA, CASTLE_FEE);
                }
            }
        }
    }
Горе кодеры которые не хотят хоть чуточку подумать и решить по человечески данную задачу
 
Кто не в курсе в каком классе смотрим сюда.
LogisticsOfficerInstance
 
Назад
Сверху Снизу