Перейти к содержанию

Gaikotsu

Постоялец
  • Публикаций

    1576
  • Зарегистрирован

  • Посещение

  • Победитель дней

    63
  • Отзывы

    0%

Весь контент Gaikotsu

  1. Gaikotsu

    RelationChanged GF

    package l2p.gameserver.enums; public enum Relation { BATTLE_ZONE(1 << 0), PVP(1 << 1), PK(1 << 2), PARTY_MEMBER(1 << 3), // party member PARTY_LEADER(1 << 4), // true if is party leader HAS_PARTY(1 << 5), // true if is in party CLAN_MEMBER(1 << 6), // true if is in clan CLAN_LEADER(1 << 7), // true if is clan leader CLAN_MATE(1 << 8), // true if is in same clan IN_SIEGE(1 << 9), // true if in siege SIEGE_ATTACKER(1 << 10), // true when attacker SIEGE_ALLY(1 << 11), // blue siege icon, cannot have if red SIEGE_ENEMY(1 << 12), // true when red icon, doesn't matter with blue UNK_13(1 << 13), CLAN_WAR_1_SIDED(1 << 14), // single sword CLAN_WAR_2_SIDED(1 << 15), // double sword ALLY_MEMBER(1 << 16), // clan is in alliance ALLY_LEADER(1 << 17), // ally leader DUEL_ENEMY(1 << 18), TERRITORY_WAR(1 << 19), // in erritory war TERRITORY_WAR_ENEMY(1 << 20), // territory war enemy? BLOCK_CHECKER_BLUE(1 << 21), // block checker blue? BLOCK_CHECKER_RED(1 << 22), // block checker red? PVP_BLUE(1 << 23), // blue sword PVP_RED(1 << 24), // red sword PVP_MASTER(1 << 25); // blue/red sword + this = blue/red crown private final int _mask; Relation(int mask) { _mask = mask; } public int getMask() { return _mask; } } package l2p.gameserver.network.s2c; import static l2p.gameserver.network.s2c.ExSetCompassZoneCode.ZONE_PVP_FLAG; import java.util.ArrayList; import java.util.List; import l2p.gameserver.enums.ClanUnitType; import l2p.gameserver.enums.Relation; import l2p.gameserver.enums.TeamType; import l2p.gameserver.managers.games.HandysBlockCheckerManager; import l2p.gameserver.managers.games.HandysBlockCheckerManager.ArenaParticipantsHolder; import l2p.gameserver.model.Party; import l2p.gameserver.model.Playable; import l2p.gameserver.model.Player; import l2p.gameserver.model.clan.Clan; import l2p.gameserver.model.entity.events.GlobalEvent; public class RelationChanged extends L2GameServerPacket { public static final byte SEND_ONE = (byte) 0x00; public static final byte SEND_DEFAULT = (byte) 0x01; public static final byte SEND_MULTI = (byte) 0x04; private RelationData _single; private List<RelationData> _multi; private byte _mask = (byte) 0x00; public static class RelationData { int _objId; int _relation; int _autoAttackable; int _karma; int _pvpFlag; } public RelationChanged() { _mask |= SEND_MULTI; _multi = new ArrayList<RelationData>(); } public RelationChanged(Playable playable, boolean autoAttackable, int relation) { _mask |= SEND_ONE; _single = new RelationData(); _single._objId = playable.getObjectId(); _single._relation = relation; _single._autoAttackable = autoAttackable ? 1 : 0; _single._karma = playable.getKarma(); _single._pvpFlag = playable.getPvpFlag(); } public void add(RelationData data) { _multi.add(data); } @Override protected void writeImpl() { writeC(0xCE); writeC(_mask); if (_multi == null || _multi.isEmpty()) { writeRelation(_single); } else { writeH(_multi.size()); for (RelationData data : _multi) writeRelation(data); } } private void writeRelation(RelationData data) { writeD(data._objId); if ((_mask & SEND_DEFAULT) == 0) { writeD(data._relation); writeC(data._autoAttackable); writeD(data._karma); writeC(data._pvpFlag); } } /** * @param targetPlayable игрок, отношение к которому изменилось * @param activeChar игрок, которому будет отослан пакет с результатом */ public static L2GameServerPacket update(Player sendTo, Playable targetPlayable, Player activeChar) { if (sendTo == null || targetPlayable == null || activeChar == null) return null; Player targetPlayer = targetPlayable.getPlayer(); int relation = targetPlayer == null ? 0 : getRelation(targetPlayer, activeChar); return new RelationChanged(targetPlayable, targetPlayable.isTargetable() && targetPlayable.isAutoAttackable(activeChar, null), relation); } private static int getRelation(Player player, Player target) { int result = 0; if ((player.getZoneMask() & ZONE_PVP_FLAG) == ZONE_PVP_FLAG) result |= Relation.BATTLE_ZONE.getMask(); if (player.getPvpFlag() != 0) result |= Relation.PVP.getMask(); if (player.getKarma() < 0) result |= Relation.PK.getMask(); Clan clan1 = player.getClan(); Clan clan2 = target.getClan(); if (clan1 != null) { result |= Relation.CLAN_MEMBER.getMask(); if (player.isClanLeader()) result |= Relation.CLAN_LEADER.getMask(); if (clan1 == clan2) result |= Relation.CLAN_MATE.getMask(); if (clan1.getAllianceId() != 0) { result |= Relation.ALLY_MEMBER.getMask(); if (clan1.getAlliance().getLeader() == clan1 && player.isClanLeader()) result |= Relation.ALLY_LEADER.getMask(); } } if (clan1 != null && clan2 != null) { if (target.getUnitType() != ClanUnitType.ACADEMY && player.getUnitType() != ClanUnitType.ACADEMY && target.getChaosFestivalMode() < 2 && player.getChaosFestivalMode() < 2) { if (clan2.isAtWarWith(clan1)) { result |= Relation.CLAN_WAR_1_SIDED.getMask(); if (clan1.isAtWarWith(clan2)) result |= Relation.CLAN_WAR_2_SIDED.getMask(); } } } Party party = player.getParty(); if (party != null) { if (party == target.getParty()) result |= Relation.HAS_PARTY.getMask(); result |= Relation.PARTY_MEMBER.getMask(); if (party.isLeader(player)) result |= Relation.PARTY_LEADER.getMask(); } if (player.getBlockCheckerArena() != -1) { ArenaParticipantsHolder holder = HandysBlockCheckerManager.getInstance().getHolder(player.getBlockCheckerArena()); int team = holder.getPlayerTeam(player); if (team == 0) { result |= Relation.BLOCK_CHECKER_RED.getMask(); result |= Relation.PVP_RED.getMask(); } else if (team == 1) { result |= Relation.BLOCK_CHECKER_BLUE.getMask(); result |= Relation.PVP_BLUE.getMask(); } } if (player.getPvPEventMode() > 0) { int mode = player.getPvPEventMode(); TeamType team = player.getTeam(); if (mode == 2) { if (team == TeamType.RED) result |= Relation.PVP_RED.getMask(); else if (team == TeamType.BLUE) result |= Relation.PVP_BLUE.getMask(); } else { if (team != TeamType.NONE) result |= Relation.PVP_RED.getMask(); } } for (GlobalEvent e : player.getEvents()) result = e.getRelation(player, target, result); return result; } } Ну и дополняется маска еще в глобал эвентах, упаравляющих разными видами осад Например вот так public int getRelation(Player thisPlayer, Player targetPlayer, int result) { Clan clan1 = thisPlayer.getClan(); Clan clan2 = targetPlayer.getClan(); if (clan1 == null || clan2 == null) return result; SiegeEvent<?, ?> siegeEvent2 = targetPlayer.getEvent(SiegeEvent.class); if (this == siegeEvent2) { result |= Relation.IN_SIEGE.getMask(); if ((thisPlayer.getZoneMask() & ExSetCompassZoneCode.ZONE_SIEGE_FLAG) != ExSetCompassZoneCode.ZONE_SIEGE_FLAG) return result; SiegeClanObject siegeClan1 = getSiegeClan(SiegeEvent.ATTACKERS, clan1); SiegeClanObject siegeClan2 = getSiegeClan(SiegeEvent.ATTACKERS, clan2); if (siegeClan1 == null && siegeClan2 == null || siegeClan1 != null && siegeClan2 != null && isAttackersInAlly()) result |= Relation.SIEGE_ALLY.getMask(); else result |= Relation.SIEGE_ENEMY.getMask(); if (siegeClan1 != null) result |= Relation.SIEGE_ATTACKER.getMask(); } return result; } Сразу говрю, что тут у меня скорее всего немного избыточный список типов релейшнов, т.к. это с более свежих хроник - не факт что все из них были в ГФ.
  2. Тут экстрасенсов нет, чтобы догадаться по одной строчке из скрипта
  3. Gaikotsu

    RelationChanged GF

    Приходят не "разные числа" а битовая маска. Ну а копать? ищи начиная с пакета RelationChanged, где идет формирование этой маски и что с ней не так. Еще как вариант возможно не шлется вовремя при входе/выходе в зоны или телепорте - тут можно долго гадать.
  4. По тексту предупреждений же все видно - неужели вобще не знаешь английский? У тебя изначально в скриптах этих косяк - переменная npcId сравнивается сама с собой.
  5. А, аналог комиссионки, как в новых хрониках. Ну так изучай скрипты этого дела, если исходники конечно есть. Ищи где идет отправка на почту и замени выдачей в инвентарь и все.
  6. А нафига? В любом же случае придется слать на почту, если на момент выдачи победителя в игре не будет.
  7. L2FileEdit или L2ClientDat
  8. Вы мне напоминаете одного моего друга, который свято уверен что все в мире только и желают что следить и т.п. за ним... У вас походу тоже паранойя в терминальной стадии... Вобщем удачи в поисках "идеальной сборки"...
  9. я конечно не мегаспециалист в яве, но учитывая что над имеющейся сборкой я работаю уже дай бог памяти лет пять-шесть (если не больше) и по сути весь код был уже не раз чуть ли не полностью перелопачен - вероятность того что там есть какие-то специально заложенные дыры, да и вобще критические проблемы - стремится к 0. К тому же у нас не сервер-однодневка с онлайном в пару человек, переоткрывающийся каждые пару недель, а вполне себе работающий уже лет 15 сервер без единого вайпа и закрытия/переоткрытия (мы с С1 если что еще начинали) - и уж точно бы всякие проблемы с безопасностью и возможностью что-то сделать с сервером или как-то нажиться на недоработках бы всплыли уже давно. Вобще у тебя какая-то нездоровая паранойя на тему "как страшно жить - везде бэкдоры"...
  10. Повторяю - я не с ХФ работаю, а с ГК в данный момент, со сборкой, в основе имеющей тот самый овер из шары. Ну и в шару выкладывать нашу сборку или "делиться" не буду - разработка идет в данный момент только для нашего сервера и все. Да, есть у нас и сборка ХФ, тех времен, когда параллельно основному серверу запускали еще и серв ХФ и сборка на базе того же самого овера, но и ее я выкладывать или кому-то давать не буду. Да она особо от оригинального шарного овера не отличается - я в нее в основном просто переносил свои разные наработки из основного сервера (в то время он был еще сервером Линдвиора).
  11. Gaikotsu

    Дроп предмета

    Листенер на подбор предмета и всех делов - в самом листенере уже можешь делать с подобранным предметом что угодно. Само собой в сборке должна быть реализация подобного листенера, а если нет, то это делается элементарно - если конечно исходники ядра есть. Еще как вариант в некоторых сборках есть возможность регать хэндлеры на выкидывание/подбор предметов и в них делать то что нужно. Как вариант советую поискать как в сборке реализована установка/удаление наемников в замках - вполне возможно что как раз через подобные хэндлеры.
  12. вобще-то обычно что у персонажей, что у нпс многие расчеты стат и т.п. общие хотя конечно от сборки зависит опять же
  13. Ну все критичные баги в овере/лосте быстро обычно правятся - не так уж их и много. Другое дело что никто не будет расписывать все эти баги и фиксы чтобы другие фиксили - зачем конкурентов то плодить? З.Ы. у меня к примеру сервер на базе овера тоже, проблем нет - все что всплывало критичного - уже давно выправлено, сейчас разве что всякая мелочевка изредка всплывает периодически. но опять же и у меня код сервера уже во многом значительно от оригинального овера отличается, т.к. некоторые механики я вобще полностью выкидывал и писал по своему, с нуля. З.З.Ы. и если что у меня не ХФ, а хроники выше.
  14. в NpcString клиента то точно добавил под нужными ид названия для всех состояний квеста?
  15. Ну я могу поработать немного Вангой - на 99.9% уверен что он пытается выделить более 1.5 гб памяти, пользуясь при этом 32-битной явой.
  16. Зачем делать такие сложные телодвижения - лучше на форуме спросить... З.Ы. это сарказм, если что З.З.Ы. что-то чем дальше, тем ниже уровень "одминов" суперпупермегасерверов...
  17. Gaikotsu

    Обычный рес

    Смотреть какой скилл привязан к свитку реса и править у этого скилла время каста
  18. смотреть по аи других мобов там - если мне память не изменяет, то блок урона снимается когда вроде бы убиваешь других определенных мобов в инстансе
  19. Gaikotsu

    Эпик контроль

    тебе поможет гугл.переводчик.
  20. Мда... глянул я содержимое GrandBossSpawn.java и знаете господа... в приличном обществе за такой код бьют канделябрами, прямо по бестолковке... Каждый раз, когда кто-то юзает команду, лезть в бд за данными... Добавлено позже: Оу!... Я сразу даже не заметил главного маразма в коде - там на получение статуса каждого босса из списка идет процесс "коннект с бд -> чтение данных -> закрытие коннекта". Т.е. в данном случае 9 (девять!) раз соединяется с бд чтобы получить данные.
  21. Gaikotsu

    DailyQuestsManager

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

    1. WARNING in \DonateSkills

    Я так думаю с твоими познаниями в яве единственный вариант - кому-то заказать переделку/написание. З.Ы. нет - я не возьмусь копаться в этом недоразумении под названием пв-софт...
  23. да еще, чтобы убрать зависимость от рейтов сервера, можно размещать подобный дроп в списке дропа особого типа - не подверженном рейтам сервера. хз что у тебя за сборка, но на сборках на базе овера это делается примерно вот так: <npc id="8441" name="Дух Капитана Пиратов Утанки" title=""> <rewardlist type="NOT_RATED_GROUPED"> <group chance="100.00000"> <reward item_id="23236" min="1" max="1" chance="100.00000" /> <!-- [100.00000%] Свиток Телепорта к Надгробию Капитана Пиратов Утанки / Scroll of Escape: Uthanka's Tomb --> </group> </rewardlist> </npc> в данном случае какие бы рейты у сервера не были - всегда со 100% шансом с этого моба будет падать только 1 свиток. еще есть вариант с типом NOT_RATED_NOT_GROUPED - он аналогичен по описанию и принципу выпадения спойлу, но тоже не подвержен рейтам.
  24. для того чтобы у него на рейтах х100 падал один лс из группы - надо чтобы шанс группы был 1% тогда на рейтах х100 это превратится в 100%, т.е. предмет из группы будет выпадать всегда. правда если есть что-то что рейты поднимает (па, руны и т.п.), то логика все равно сломается и будет падать больше 1 штуки, т.к. шанс группы в этом случае превысит 100%, а в большинстве сборок при этом начинает множиться количество выпадающих предметов. З.Ы. ну и само собой не надо забывать что сумма шансов всех предметов в самой группе должна быть равна ровно 100%.
  25. по мне так наоборот, чем дальше тем все же более оптимизированней клиент становится. хотя конечно разных ляпов хватает, случайно сделанных корейцами, но они в принципе есть в клиентах всех хроник
×
×
  • Создать...