package osiris.game.model; /* * Osiris Emulator * Copyright (C) 2011 Garrett Woodard, Blake Beaupain, Travis Burtrum * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * 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 . */ import java.util.ArrayList; import java.util.Iterator; import java.util.List; import osiris.ServerEngine; import osiris.game.action.Action; import osiris.game.model.combat.CombatUtilities; import osiris.game.model.combat.Hit; import osiris.game.model.combat.HitType; import osiris.game.model.effect.PrayerEffect; import osiris.game.model.item.Item; import osiris.game.model.skills.Prayer; import osiris.game.update.UpdateBlock; import osiris.game.update.block.AppearanceBlock; import osiris.game.update.block.GraphicsBlock; import osiris.util.StopWatch; import osiris.util.Utilities; // TODO: Auto-generated Javadoc /** * The Class Death. Making it an Action so I can set it as the Player's action, * however not running it so the server can manage deaths, so x logging doesn't * stop the action. * * @author Boomer * */ public class Death extends Action { /** The Constant DEFAULT_DURATION. */ public static final int DEFAULT_DURATION = 7; /** The timer. */ private StopWatch timer; /** The killer. */ private Character dying, killer; /** The kept on death. */ private ArrayList items, keptOnDeath; /** The stage. */ private int stage; /** The duration. */ private int duration; /** The gravestone. */ private Position gravestone; /** * Instantiates a new death. * * @param dying * the dying * @param killer * the killer * @param items * the items */ public Death(Character dying, Character killer, ArrayList items) { this(dying, killer, items, DEFAULT_DURATION); } /** * Instantiates a new death. * * @param dying * the dying * @param killer * the killer * @param items * the items * @param duration * the duration */ public Death(Character dying, Character killer, ArrayList items, int duration) { super(dying); if (dying instanceof Player) this.keptOnDeath = ((Player) dying).getItemsKeptOnDeath(); else keptOnDeath = new ArrayList(); if (dying != null) { for (Iterator blocks = dying.getUpdateBlocks().iterator(); blocks.hasNext();) if (blocks.next() instanceof AppearanceBlock) blocks.remove(); if (dying instanceof Player) { Player player = ((Player) dying); PrayerEffect revenge = player.getPrayers().get(Prayer.Type.HEADICON); if (revenge != null && revenge.getPrayer() == Prayer.RETRIBUTION) { int maxHit = (int) (player.getSkills().maxLevel(Skills.SKILL_PRAYER) * .25); player.addUpdateBlock(new GraphicsBlock(dying, 437, 0)); boolean singleCombat = CombatUtilities.singleCombat(player.getPosition()); boolean hitCharacter = false; for (Player other : player.getLocalPlayers()) if (Utilities.getDistance(other.getPosition(), player.getPosition()) <= 3) { Hit hit = new Hit(player, other, Utilities.random(maxHit), 0, HitType.RECOIL); ServerEngine.getHitQueue().add(hit); hitCharacter = true; if (singleCombat) break; } if (!singleCombat || !hitCharacter) { for (Npc other : player.getLocalNpcs()) { if (Utilities.getDistance(other.getPosition(), player.getPosition()) <= 3) { Hit hit = new Hit(player, other, Utilities.random(maxHit), 0, HitType.RECOIL); ServerEngine.getHitQueue().add(hit); if (singleCombat) break; } } } player.getSkills().setCurLevel(Skills.SKILL_PRAYER, 0); } for (Prayer.Type key : ((Player) dying).getPrayers().keySet()) ((Player) dying).getPrayers().put(key, null); } dying.getEffects().clear(); } this.timer = new StopWatch(); this.dying = dying; this.killer = killer; this.items = items; if (dying != null) this.gravestone = dying.getPosition(); this.duration = duration; if (dying instanceof Player && ((Player) dying).getPlayerStatus() < 2) { ((Player) dying).getInventory().clear(); ((Player) dying).getEquipment().clear(); } progress(); } /** * Sets the duration. * * @param duration * the duration * @return the death */ public Death setDuration(int duration) { this.duration = duration; return this; } /** * Gets the timer. * * @return the timer */ public StopWatch getTimer() { return timer; } /** * Gets the dying. * * @return the dying */ public Character getDying() { return dying; } /** * Gets the killer. * * @return the killer */ public Character getKiller() { return killer; } /** * Gets the items. * * @return the items */ public List getItems() { return items; } /** * Gets the kept on death. * * @return the kept on death */ public ArrayList getKeptOnDeath() { return keptOnDeath; } /** * Progress. */ public void progress() { this.stage++; } /** * Gets the stage. * * @return the stage */ public int getStage() { return stage; } /** * Gets the gravestone. * * @return the gravestone */ public Position getGravestone() { return gravestone; } /* * (non-Javadoc) * * @see osiris.game.action.Action#onCancel() */ @Override public void onCancel() { } /* * (non-Javadoc) * * @see osiris.game.action.Action#onRun() */ @Override public void onRun() { } /** * Gets the duration. * * @return the duration */ public int getDuration() { return duration; } }