/* * This file is part of the OdinMS Maple Story Server Copyright (C) 2008 ~ 2010 * Patrick Huy <patrick.huy@frz.cc> Matthias Butz <matze@odinms.de> Jan * Christian Meyer <vimes@odinms.de> * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Affero General Public License version 3 as published by * the Free Software Foundation. You may not use, modify or distribute this * program under any other version of the GNU Affero General Public License. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more * details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package javastory.channel.handling; import javastory.channel.ChannelCharacter; import javastory.channel.ChannelClient; import javastory.channel.anticheat.CheatingOffense; import javastory.channel.maps.Door; import javastory.channel.maps.GameMapObject; import javastory.channel.maps.Reactor; import javastory.channel.server.InventoryManipulator; import javastory.game.Item; import javastory.game.Stat; import javastory.game.data.ItemInfoProvider; import javastory.io.PacketFormatException; import javastory.io.PacketReader; import javastory.server.FameLog; import javastory.tools.FameResponse; import javastory.tools.packets.ChannelPackets; public final class PlayersHandler { private PlayersHandler() { } public static void handleNoteAction(final PacketReader reader, final ChannelCharacter chr) throws PacketFormatException { final byte type = reader.readByte(); switch (type) { case 1: final byte num = reader.readByte(); reader.skip(2); for (int i = 0; i < num; i++) { final int id = reader.readInt(); reader.skip(1); chr.deleteNote(id); } break; default: System.out.println("Unhandled note action, " + type + ""); } } public static void handleGiveFame(final PacketReader reader, final ChannelClient c, final ChannelCharacter famer) throws PacketFormatException { final int receiverId = reader.readInt(); final boolean isIncrease = reader.readBoolean(); final int change = isIncrease ? 1 : -1; final ChannelCharacter receiver = (ChannelCharacter) famer.getMap().getMapObject(receiverId); if (receiver == famer) { famer.getCheatTracker().registerOffense(CheatingOffense.FAMING_SELF); return; } if (famer.getLevel() < 15) { famer.getCheatTracker().registerOffense(CheatingOffense.FAMING_UNDER_15); return; } FameResponse responseCode = FameResponse.SUCCESS; if (FameLog.hasFamedRecently(famer.getId(), receiverId)) { responseCode = FameResponse.ONCE_A_MONTH; } else if (famer.hasFamedToday()) { responseCode = FameResponse.ONCE_A_DAY; } if (responseCode != FameResponse.SUCCESS) { c.write(ChannelPackets.giveFameErrorResponse(responseCode)); return; } if (Math.abs(receiver.getFame() + change) <= 30000) { receiver.addFame(change); receiver.updateSingleStat(Stat.FAME, receiver.getFame()); final long timestamp = FameLog.addEntry(famer.getId(), receiverId); famer.setLastFameTime(timestamp); c.write(ChannelPackets.giveFameResponse(isIncrease, receiver.getName(), receiver.getFame())); receiver.getClient().write(ChannelPackets.receiveFame(isIncrease, famer.getName())); } } public static void handleUseDoor(final PacketReader reader, final ChannelCharacter chr) throws PacketFormatException { final int oid = reader.readInt(); final boolean mode = reader.readByte() == 0; // specifies if backwarp or not, 1 town to target, 0 target to town for (final GameMapObject obj : chr.getMap().getAllDoor()) { final Door door = (Door) obj; if (door.getOwner().getId() == oid) { door.warp(chr, mode); break; } } } public static void handleTransformPlayer(final PacketReader reader, final ChannelClient c, final ChannelCharacter chr) throws PacketFormatException { // D9 A4 FD 00 // 11 00 // A0 C0 21 00 // 07 00 64 66 62 64 66 62 64 reader.skip(4); // Timestamp final byte slot = (byte) reader.readShort(); final int itemId = reader.readInt(); final String target = reader.readLengthPrefixedString().toLowerCase(); final Item toUse = c.getPlayer().getUseInventory().getItem(slot); if (toUse == null || toUse.getQuantity() < 1 || toUse.getItemId() != itemId) { c.write(ChannelPackets.enableActions()); return; } switch (itemId) { case 2212000: for (final ChannelCharacter search_chr : c.getPlayer().getMap().getCharacters()) { if (search_chr.getName().toLowerCase().equals(target)) { ItemInfoProvider.getInstance().getItemEffect(2210023).applyTo(search_chr); search_chr.sendNotice(6, chr.getName() + " has played a prank on you!"); InventoryManipulator.removeFromSlot(c, chr.getUseInventory(), slot, (short) 1, false); } } break; } } public static void handleHitReactor(final PacketReader reader, final ChannelClient c) throws PacketFormatException { final int oid = reader.readInt(); final int charPos = reader.readInt(); final short stance = reader.readShort(); final Reactor reactor = c.getPlayer().getMap().getReactorByOid(oid); if (reactor == null || !reactor.isAlive()) { return; } reactor.hitReactor(charPos, stance, c); } }