/** Очистить территорию от левых игроков. */ protected final void clearTerritory() { if (eventTerritory == null) { return; } WorldZoneTable worldZoneTable = WorldZoneTable.getInstance(); Array<TObject> objects = eventTerritory.getObjects(); TObject[] objs = objects.array(); objects.writeLock(); try { for (int i = 0, length = objects.size(); i < length; i++) { TObject object = objs[i]; if (!object.isPlayer()) { continue; } Player player = object.getPlayer(); if (!players.containsKey(player.getObjectId())) { player.teleToLocation(worldZoneTable.getRespawn(player)); i--; length--; } } } finally { objects.writeUnlock(); } }
@Override public boolean unregisterPlayer(Player player) { lock(); try { if (!isStarted()) { player.sendMessage("Ивент не запущен."); return false; } if (getState() != EventState.REGISTER) { player.sendMessage("Время регистрации вышло."); return false; } Array<Player> prepare = getPrepare(); if (!prepare.contains(player)) { player.sendMessage("Вы не зарегестрированы."); return false; } prepare.fastRemove(player); player.setEvent(false); player.sendMessage("Вы отрегестрированы."); return false; } finally { unlock(); } }
@Override public void addAggro(Character aggressor, long aggro, boolean damage) { // если это не урон от игрока if (!damage && aggressor.isPlayer()) { // получаем игрока Player player = aggressor.getPlayer(); // в зависимости от класса игрока switch (player.getPlayerClass()) { case WARRIOR: case LANCER: aggro = 1; break; case MYSTIC: case PRIEST: aggro *= 3; break; default: break; } } // обрабатываем добавление аггро super.addAggro(aggressor, aggro, damage); }
@Override public boolean checkTarget(Character target) { // полукчаем игрока из цели Player player = target.getPlayer(); // если это игрок на ивенте ,то можно бить return player != null && player.isEvent(); }
@Override public void causingDamage(Skill skill, AttackInfo info, Character attacker) { // полукчаем игрока из атакующего Player player = attacker.getPlayer(); if (!player.isEvent()) return; super.causingDamage(skill, info, attacker); }
@Override public void causingDamage(Skill skill, AttackInfo info, Character attacker) { // пробуем получить игрока Player player = attacker.getPlayer(); // если это игрок и он не на ивенте, выходим if (player != null && !player.isEvent()) return; super.causingDamage(skill, info, attacker); }
@Override public Packet processing(Packet packet) { String nick = packet.nextString(); String text = packet.nextString(); Player player = World.getPlayer(nick); if (player == null) return null; player.sendMessage(text); return null; }
@Override public void onDelete(TObject object) { if (!object.isPlayer()) { return; } Player player = object.getPlayer(); if (!player.isEvent()) { return; } onDelete(player); }
@Override public void onDie(Character killer, Character killed) { if (!isCheckDieState() || !killed.isPlayer()) { return; } Player player = killed.getPlayer(); if (!player.isEvent() || !players.containsKey(killed.getObjectId())) { return; } onDie(player, killer); }
@Override public boolean test(Npc npc, Player player) { // если игрока нет, выходим if (player == null) { log.warning(this, "not found player"); return false; } // получаем список квестов QuestList questList = player.getQuestList(); // если его нет, возвращаем плохо if (questList == null) { log.warning(this, "not found quest list"); return false; } // получаеми состояние квеста QuestState state = questList.getQuestState(quest); // если его нет, возвращаем плохо if (state == null) return false; // получаем значение переменой Wrap wrap = state.getVar(name); // если его нет if (wrap == null) // сравниваем значение с 0 return value == 0; // иначе просто сравниваем значение return wrap.getInt() == value; }
@Override public int getChanceFor(Player player) { // получаем формулы Formulas formulas = Formulas.getInstance(); // рассчитываем шанс сбора return formulas.getChanceCollect(getTemplate().getReq(), player.getEnergyLevel()); }
public static QuestStarted getInstance( QuestState quest, int npcType, int npcId, float x, float y, float z) { QuestStarted packet = (QuestStarted) instance.newInstance(); packet.buffer = packet.prepare; Player player = quest.getPlayer(); packet.writeShort(1); // 01 00 packet.writeShort(14); // 0E 00 packet.writeInt(12); // 0C 00 00 00 packet.writeShort(0); // 00 00 packet.writeInt(14); // 0E 00 00 00 packet.writeShort(1); // 01 00 packet.writeShort(57); // 39 00 packet.writeShort(1); // 01 00 packet.writeShort(85); // 55 00 packet.writeInt(quest.getQuestId()); // 29 05 00 00 //NPC ID packet.writeInt(quest.getObjectId()); // C4 E0 89 00 //Обжект ид packet.writeInt(quest.getState()); // 01 00 00 00 //номер квеста уданного нпц packet.writeInt( 1); // 01 00 00 00 00 00 00 00 // если 0, то квест красным висит, 1 обычный показ packet.writeInt(0); packet.writeInt(quest.getPanelStateId()); // 00 00 00 00 quest.getPanelStateId() packet.writeInt(0x00010100); // 00 01 01 00 packet.writeShort(0); // 00 00 packet.writeByte(0); // 00 packet.writeInt(57); // 39 00 00 00 //след сектор packet.writeFloat(x); // 0B D1 A9 47 //видимо где след этап квеста X packet.writeFloat(y); // 1F 3D A6 C7 //видимо где след этап квеста Y packet.writeFloat(z); // 88 11 90 C5 //видимо где след этап квеста Z packet.writeInt(npcType); // D5 00 00 00 //213 packet.writeInt(npcId); // EB 03 00 00 //1003 видимо ид след НПЦ packet.writeInt(player != null ? player.getZoneId() : 13); // 0D 00 00 00 //13 packet.writeLong(85); // 55 00 00 00 00 00 00 00 //85 return packet; }
@Override public void causingDamage(Skill skill, AttackInfo info, Character attacker) { // определяем атакующего игрока Player player = null; if (attacker.isSummon()) { Character owner = attacker.getOwner(); if (owner != null && owner.isPlayer()) player = owner.getPlayer(); } else if (attacker.isPlayer()) player = attacker.getPlayer(); // если игрока нет, урон не засчитываем if (player == null) return; // получаем гильдию игрока Guild guild = player.getGuild(); // если гильдии нет либо она не из этой битвы, не засчитываем урон if (guild == null || !getRegion().isRegister(guild)) return; // обрабатываем урон super.causingDamage(skill, info, attacker); }
@Override public void increaseReq(Player player) { if (player.getEnergyLevel() >= Config.WORLD_MAX_COLLECT_LEVEL) return; // увеличиваем уровень сбора player.setEnergyLevel(player.getEnergyLevel() + 1); // отправляю сообщение player.sendPacket( ResourseIncreaseLevel.getInstance(getTemplate().getType(), player.getEnergyLevel()), true); // обновляю статы player.updateInfo(); }
@Override public void removeMe(Player player, int type) { player.sendPacket(CharObjectDelete.getInstance(this), true); }
@Override public void addMe(Player player) { player.sendPacket(TrapInfo.getInstance(this), true); }
@Override public void execution(String command, Player player, String values) { switch (command) { case "event_reg": { if (values == null) { return; } EventManager eventManager = EventManager.getInstance(); eventManager.registerPlayer(values, player); break; } case "restore_characters": { PlayerManager playerManager = PlayerManager.getInstance(); playerManager.restoreCharacters(player); break; } case "help": player.sendMessage(help); break; case "time": { synchronized (date) { date.setTime(System.currentTimeMillis()); player.sendMessage(timeFormat.format(date)); } break; } case "end_pay": { Account account = player.getAccount(); long time = account.getEndPay(); if (System.currentTimeMillis() > time) player.sendMessage("У вас не проплаченный аккаунт."); else { synchronized (date) { date.setTime(time); player.sendMessage("Дата завершения проплаты: " + timeFormat.format(date)); } } break; } case "restore_skills": { Table<IntKey, Skill> current = player.getSkills(); DataBaseManager dbManager = DataBaseManager.getInstance(); for (Skill skill : current) { if (skill.getClassId() == -15) continue; player.removeSkill(skill, false); dbManager.deleteSkill(player, skill); skill.fold(); } current.clear(); player.getTemplate().giveSkills(player); player.sendPacket(SkillListInfo.getInstance(player), true); break; } case "kill_me": { if (player.isBattleStanced()) { player.sendMessage("Нельзя использовать в бою."); return; } synchronized (player) { player.setCurrentHp(0); player.doDie(player); } break; } case "version": player.sendMessage("Текущая версия сервера: " + Config.SERVER_VERSION); break; case "online": { OnlineManager onlineManager = OnlineManager.getInstance(); player.sendMessage("Текущий онлаин: " + onlineManager.getCurrentOnline()); break; } case "player_info": { if (player.getName().equals(values)) return; Player target = World.getAroundByName(Player.class, player, values); if (target == null) target = World.getPlayer(values); if (target == null) { player.sendMessage(MessageType.THAT_CHARACTER_ISNT_ONLINE); return; } StringBuilder builder = new StringBuilder("\n--------\nPlayer: \"").append(target.getName()).append("\":\n"); builder.append("attack:").append(target.getAttack(null, null)).append(";\n"); builder.append("defense:").append(target.getDefense(null, null)).append(";\n"); builder.append("impact:").append(target.getImpact(null, null)).append(";\n"); builder.append("balance:").append(target.getBalance(null, null)).append(";\n"); builder.append("max hp:").append(target.getMaxHp()).append(".\n"); builder.append("--------"); player.sendMessage(builder.toString()); break; } } }
@Override public boolean registerPlayer(Player player) { lock(); try { if (!isStarted()) { player.sendMessage("Ивент не запущен."); return false; } if (getState() != EventState.REGISTER) { player.sendMessage("Время регистрации вышло."); return false; } if (player.getLevel() > getMaxLevel() || player.getLevel() < getMinLevel()) { player.sendMessage("Вы не подходите по уровню."); return false; } Array<Player> prepare = getPrepare(); if (prepare.contains(player)) { player.sendMessage("Вы уже зарегестрированы."); return false; } if (player.isDead()) { player.sendMessage("Вы мертвы."); return false; } if (player.hasDuel()) { player.sendMessage("Вы находитесь в дуэли."); return false; } prepare.add(player); player.setEvent(true); player.sendMessage("Вы зарегестрированы."); return true; } finally { unlock(); } }