/* * This file is part of aion-unique <aion-unique.org>. * * aion-unique is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * aion-unique 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with aion-unique. If not, see <http://www.gnu.org/licenses/>. */ package com.aionemu.gameserver.taskmanager.tasks; import com.aionemu.gameserver.model.gameobjects.Creature; import com.aionemu.gameserver.model.gameobjects.player.Player; import com.aionemu.gameserver.taskmanager.AbstractFIFOPeriodicTaskManager; /** * @author lord_rex and MrPoke * */ public final class PacketBroadcaster extends AbstractFIFOPeriodicTaskManager<Creature> { private static final class SingletonHolder { private static final PacketBroadcaster INSTANCE = new PacketBroadcaster(); } public static PacketBroadcaster getInstance() { return SingletonHolder.INSTANCE; } private PacketBroadcaster() { super(100); } public static enum BroadcastMode { UPDATE_PLAYER_HP_STAT { @Override public void sendPacket(Creature creature) { ((Player) creature).getLifeStats().sendHpPacketUpdateImpl(); } }, UPDATE_PLAYER_MP_STAT { @Override public void sendPacket(Creature creature) { ((Player) creature).getLifeStats().sendMpPacketUpdateImpl(); } }, UPDATE_PLAYER_EFFECT_ICONS { @Override public void sendPacket(Creature creature) { ((Player) creature).getEffectController().updatePlayerEffectIconsImpl(); } }, UPDATE_NEARBY_QUEST_LIST { @Override public void sendPacket(Creature creature) { ((Player) creature).getController().updateNearbyQuestListImpl(); } }, UPDATE_PLAYER_FLY_TIME { @Override public void sendPacket(Creature creature) { ((Player) creature).getLifeStats().sendFpPacketUpdateImpl(); } } // TODO: more packets ; private final byte MASK; private BroadcastMode() { MASK = (byte) (1 << ordinal()); } public byte mask() { return MASK; } protected abstract void sendPacket(Creature creature); protected final void trySendPacket(final Creature creature, byte mask) { if((mask & mask()) == mask()) { sendPacket(creature); creature.removePacketBroadcastMask(this); } } } private static final BroadcastMode[] VALUES = BroadcastMode.values(); @Override protected void callTask(Creature creature) { for(byte mask; (mask = creature.getPacketBroadcastMask()) != 0;) { for(BroadcastMode mode : VALUES) { mode.trySendPacket(creature, mask); } } } /* (non-Javadoc) * @see com.aionemu.gameserver.taskmanager.AbstractFIFOPeriodicTaskManager#getCalledMethodName() */ @Override protected String getCalledMethodName() { return "packetBroadcast()"; } }