RuneHive-Game
Loading...
Searching...
No Matches
NpcDeath.java
Go to the documentation of this file.
1package com.runehive.game.world.entity.mob.npc;
2
3import com.runehive.content.ActivityLog;
4import com.runehive.content.achievement.AchievementHandler;
5import com.runehive.content.achievement.AchievementKey;
6import com.runehive.content.activity.impl.warriorguild.WarriorGuildUtility;
7import com.runehive.content.clanchannel.content.ClanTaskKey;
8import com.runehive.content.collectionlog.CollectionLog;
9import com.runehive.content.event.EventDispatcher;
10import com.runehive.content.event.impl.OnKillEvent;
11import com.runehive.game.Animation;
12import com.runehive.game.UpdatePriority;
13import com.runehive.game.world.World;
14import com.runehive.game.world.entity.combat.strategy.npc.boss.skotizo.SkotizoUtility;
15import com.runehive.game.world.entity.mob.Mob;
16import com.runehive.game.world.entity.mob.MobDeath;
17import com.runehive.game.world.entity.mob.npc.drop.NpcDropManager;
18import com.runehive.game.world.entity.mob.player.Player;
19import com.runehive.game.world.items.Item;
20import com.runehive.game.world.items.ground.GroundItem;
21import com.runehive.util.Utility;
22
23import java.util.Arrays;
24
25/**
26 * Handles a npc dying. (Used mostly for custom statements).
27 *
28 * @author Daniel
29 * @author <a href="http://www.rune-server.org/members/stand+up/">Stand Up</a>
30 */
31public final class NpcDeath extends MobDeath<Npc> {
32 private Runnable runnable;
33
34 /** Creates a new {@link MobDeath}. */
35 public NpcDeath(Npc mob) {
36 this(mob, () -> {
37 });
38 }
39
40 public NpcDeath(Npc mob, Runnable runnable) {
41 super(mob, mob.getDeathTime());
42 this.runnable = runnable;
43 }
44
45 @Override
46 public void preDeath(Mob killer) {
47 if (mob.definition == null) {
48 return;
49 }
50
51 mob.animate(new Animation(mob.definition.getDeathAnimation(), UpdatePriority.VERY_HIGH));
52 }
53
54 @Override
55 public void death() {
56 if (mob.owner != null || mob.definition == null || mob.definition.getRespawnTime() == -1) {
57 mob.unregister();
58 return;
59 }
60
61 mob.setVisible(false);
62 World.schedule(mob.definition.getRespawnTime(), () -> {
63 mob.move(mob.spawnPosition);
64 mob.npcAssistant.respawn();
65 mob.unvenom();
66 mob.unpoison();
67 });
68 }
69
70 @Override
71 public void postDeath(Mob killer) {
72 if (killer == null)
73 return;
74
75 /* Npc name. */
76 String name = mob.getName().toUpperCase().replace(" ", "_");
77
78 runnable.run();
79
80 switch (killer.getType()) {
81 case PLAYER:
82 Player playerKiller = killer.getPlayer();
83
84 CollectionLog.onNpcKill(playerKiller, mob.id);
85
86 /* Npc drop. */
87 NpcDropManager.drop(playerKiller, mob);
88
89 /* The slayer kill activator. */
90 playerKiller.slayer.activate(mob, 1);
91
92 /* The followers. */
93 if (playerKiller.followers.contains(mob.getNpc())) {
94 playerKiller.followers.remove(mob);
95 }
96
97 /* Activity. */
98 EventDispatcher.execute(playerKiller, new OnKillEvent(mob));
99
100 /* Warrior Guild */
101 if (Arrays.stream(WarriorGuildUtility.CYCLOPS).anyMatch(cyclop -> cyclop == mob.id) && (Utility.random(20) == 0)) {
102 Item defender = new Item(WarriorGuildUtility.getDefender(playerKiller), 1);
103 GroundItem.create(playerKiller, defender, mob.getPosition());
104 return;
105 }
106
107 /* Switch statement. */
108 switch (name) {
109 case "SKOTIZO":
110 SkotizoUtility.defeated(mob, playerKiller);
112 return;
113
114 case "ZULRAH":
115 playerKiller.activityLogger.add(ActivityLog.ZULRAH);
117 return;
118
119 case "CERBERUS":
122 return;
123
124 case "GENERAL_GRAARDOR":
127 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.GENERAL_GRAARDOR, playerKiller.getName()));
128 return;
129
130 case "LAVA_DRAGON":
132 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.BLACK_DRAGON, playerKiller.getName()));
133 return;
134
135 case "KRAKEN":
136 playerKiller.activityLogger.add(ActivityLog.KRAKEN);
137 return;
138
139 case "COMMANDER_ZILYANA":
142 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.COMMANDER_ZILYANA, playerKiller.getName()));
143 return;
144
145 case "KREE'ARRA":
148 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.KREEARRA, playerKiller.getName()));
149 return;
150
151 case "K'RIL TSUTSAROTH":
154 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.KRIL_TSUTSAROTH, playerKiller.getName()));
155 return;
156
157 case "CORPOREAL_BEAST":
159 return;
160
161 case "LIZARD_SHAMAN":
163 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.LIZARD_SHAMAN, playerKiller.getName()));
164 return;
165
166 case "MITHRIL_DRAGON":
168 return;
169
170 case "DARK_BEAST":
172 return;
173
174 case "ANGRY_BARBARIAN_SPIRIT":
175 GroundItem.create(playerKiller, new Item(2404));
176 return;
177
178 case "HILL_GIANT":
179 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.HILL_GIANT, playerKiller.getName()));
180 return;
181
182 case "BLACK_DEMON":
183 case "BLACK_DEMONS":
184 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.BLACK_DEMON, playerKiller.getName()));
185 return;
186
187 case "GREATER_DEMON":
188 case "GREATER_DEMONS":
189 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.GREATER_DEMON, playerKiller.getName()));
190 return;
191
192 case "ROCK_CRAB":
193 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.ROCK_CRAB, playerKiller.getName()));
194 return;
195
196 case "SAND_CRAB":
197 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.SAND_CRAB, playerKiller.getName()));
198 return;
199
200 case "BLUE_DRAGON":
201 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.BLUE_DRAGON, playerKiller.getName()));
202 return;
203
204 case "RED_DRAGON":
205 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.RED_DRAGON, playerKiller.getName()));
206 return;
207
208 case "GREEN_DRAGON":
209 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.GREEN_DRAGON, playerKiller.getName()));
210 return;
211
212 case "BLACK_DRAGON":
213 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.BLACK_DRAGON, playerKiller.getName()));
214 return;
215
216 case "KING_BLACK_DRAGON":
217 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.BLACK_DRAGON, playerKiller.getName()));
220 return;
221
222 case "CHAOS_ELEMENTAL":
223 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.CHAOS_ELEMENTAL, playerKiller.getName()));
225 return;
226
227 case "CHAOS_FANATIC":
228 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.CHAOS_FANATIC, playerKiller.getName()));
230 return;
231
232 case "CRAZY_ARCHAEOLOGIST":
233 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.CRAZY_ARCHAEOLOGIST, playerKiller.getName()));
235 return;
236
237 case "CALLISTO":
238 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.CALLISTO, playerKiller.getName()));
240 return;
241
242 case "SCORPIA":
243 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.SCORPIA, playerKiller.getName()));
245 return;
246
247 case "VET'ION":
248 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.VETION, playerKiller.getName()));
249 playerKiller.activityLogger.add(ActivityLog.VETION);
250 return;
251
252 case "VENANTIS":
253 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.VENNANTIS, playerKiller.getName()));
255 return;
256
257 case "SKELETAL_WYVERN":
258 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.SKELETAL_WYVERN, playerKiller.getName()));
260 return;
261
262 case "ABYSSAL_DEMON":
263 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.ABYSSAL_DEMON, playerKiller.getName()));
265 return;
266
267 case "GHOST":
268 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.GHOST, playerKiller.getName()));
269 return;
270
271 case "SKELETON":
272 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.SKELETON, playerKiller.getName()));
273 return;
274
275 case "BLACK_KNIGHT":
276 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.BLACK_KNIGHT, playerKiller.getName()));
277 return;
278
279 case "BABY_BLUE_DRAGON":
280 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.BABY_BLUE_DRAGON, playerKiller.getName()));
281 return;
282
283 case "BAT":
284 case "GIANT_BAT":
285 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.BAT, playerKiller.getName()));
286 return;
287
288 case "CHAOS_DWARF":
289 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.CHAOS_DWARF, playerKiller.getName()));
290 return;
291
292 case "MAGIC_AXE":
293 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.MAGIC_AXE, playerKiller.getName()));
294 return;
295
296 case "CAVE_CRAWLER":
297 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.CAVE_CRAWLER, playerKiller.getName()));
298 return;
299
300 case "CRAWLING_HAND":
301 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.CRAWLING_HAND, playerKiller.getName()));
302 return;
303
304 case "BANSHEE":
305 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.BANSHEE, playerKiller.getName()));
306 return;
307
308 case "ICE_FIEND":
309 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.ICE_FIEND, playerKiller.getName()));
310 return;
311
312 case "HELLHOUND":
313 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.HELLHOUND, playerKiller.getName()));
314 return;
315
316 case "CAVE_HORROR":
317 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.CAVE_HORROR, playerKiller.getName()));
318 return;
319
320 case "STEEL_DRAGON":
321 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.STEEL_DRAGON, playerKiller.getName()));
322 return;
323
324 case "PYRE_FIEND":
325 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.PYRE_FIEND, playerKiller.getName()));
326 return;
327
328 case "FIRE_GIANT":
329 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.FIRE_GIANT, playerKiller.getName()));
330 return;
331
332 case "BASILISK":
333 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.BASILISK, playerKiller.getName()));
334 return;
335
336 case "COCKATRICE":
337 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.COCKATRICE, playerKiller.getName()));
338 return;
339
340 case "DUST_DEVIL":
341 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.DUST_DEVIL, playerKiller.getName()));
342 return;
343
344 case "SPIRITUAL_RANGER":
345 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.SPIRITUAL_RANGER, playerKiller.getName()));
346 return;
347
348 case "SPIRITUAL_WARRIOR":
349 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.SPIRITUAL_WARRIOR, playerKiller.getName()));
350 return;
351
352 case "BLOODVELD":
353 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.BLOODVELD, playerKiller.getName()));
354 return;
355
356 case "SPIRITUAL_MAGE":
357 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.SPIRITUAL_MAGE, playerKiller.getName()));
358 return;
359
360 case "NECHRYAEL":
361 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.NECHRYAEL, playerKiller.getName()));
362 return;
363
364 case "SMOKE_DEVIL":
365 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.SMOKE_DEVIL, playerKiller.getName()));
366 return;
367 case "REVENANT_IMP":
368 case "REVENANT_GOBLIN":
369 case "REVENANT_PYREFIEND":
370 case "REVENANT_HOBGOBLIN":
371 case "REVENANT_CYCLOPS":
372 case "REVENANT_HELLHOUND":
373 case "REVENANT_DEMON":
374 case "REVENANT_ORK":
375 case "REVENANT_DARK_BEAST":
376 case "REVENANT_DRAGON":
378 return;
379 case "DEMONIC_GORILLA":
380 playerKiller.forClan(channel -> channel.activateTask(ClanTaskKey.DEMONIC_GORILLA, playerKiller.getName()));
381 return;
382 }
383 break;
384 case NPC:
385// Npc npcKiller = killer.getNpc();
386 break;
387 }
388 }
389}
static void activate(Player player, AchievementKey achievement)
Activates the achievement for the individual player.
This class handles util methods for the Warrior's activity.
static int getDefender(Player player)
Gets the defender index to drop for the player.
static final int[] CYCLOPS
The warrior guild cyclops npcs.
static void onNpcKill(Player player, int npcId)
static boolean execute(Player player, InteractionEvent event)
void activate(Npc npc, int killAmount)
Activates killing a slayer npc.
Definition Slayer.java:171
Class that models a single animation used by an entity.
Represents the game world.
Definition World.java:46
static void schedule(Task task)
Submits a new event.
Definition World.java:247
abstract EntityType getType()
Gets the EntityType.
MobDeath(T mob, int delay)
Creates a new MobDeath.
Definition MobDeath.java:24
Handles the mob class.
Definition Mob.java:66
void preDeath(Mob killer)
The part of the death process where the character is prepared for the rest of the death tick.
Definition NpcDeath.java:46
NpcDeath(Npc mob)
Creates a new MobDeath.
Definition NpcDeath.java:35
void death()
The main part of the death process where the killer is found for the character.
Definition NpcDeath.java:55
void postDeath(Mob killer)
The last part of the death process where the character is reset.
Definition NpcDeath.java:71
Represents a non-player character in the in-game world.
Definition Npc.java:29
The manager class which holds the static entries of drop tables and has a method to execute a drop ta...
static void drop(Player killer, Npc npc)
Attempts to drop the drop table which belongs to npc#id.
This class represents a character controlled by a player.
Definition Player.java:125
void forClan(Consumer< ClanChannel > action)
Definition Player.java:568
String getName()
Gets the name of this entity.
Definition Player.java:774
The container class that represents an item that can be interacted with.
Definition Item.java:21
Represents a single Ground item on the world map.
static GroundItem create(Player player, Item item)
Creates a new GroundItem object for a player and an item.
Handles miscellaneous methods.
Definition Utility.java:27
static int random(int bound)
Definition Utility.java:239
The activity log class.
Represents different priorities for updating.