Changeset 1003

User picture

Author: ATracer

(2010/02/08 20:12) About 2 years ago

small refactoring of despawn functionality and deletion of npcs from the world for one-time spawns (from quests). Despawn of mobs should be tested during regular attack and during campaign quests.

Affected files

Updated trunk/AE-go_GameServer/data/scripts/system/handlers/quest/ascension/_1006Ascension.java Download diff

10021003
242
							activePlayerId = player.getObjectId();
242
							activePlayerId = player.getObjectId();
243
							for(Npc mob : mobs)
243
							for(Npc mob : mobs)
244
							{
244
							{
245
								mob.getController().onDie();
245
								mob.getController().onDelete();
246
							}
246
							}
247
							mobs.clear();
247
							mobs.clear();
248
							PacketSendUtility.sendPacket(player, new SM_EMOTION(player, 6, 1001, 0));
248
							PacketSendUtility.sendPacket(player, new SM_EMOTION(player, 6, 1001, 0));
...
...
337
		if(monster.getLifeStats().getCurrentHp() < monster.getLifeStats().getMaxHp() / 2)
337
		if(monster.getLifeStats().getCurrentHp() < monster.getLifeStats().getMaxHp() / 2)
338
		{
338
		{
339
			PacketSendUtility.sendPacket(player, new SM_PLAY_MOVIE(0, 151));
339
			PacketSendUtility.sendPacket(player, new SM_PLAY_MOVIE(0, 151));
340
			monster.getAi().stop();
340
			monster.getController().onDelete();
341
			monster.getController().onDie();
342
		}
341
		}
343
		return false;
342
		return false;
344
	}
343
	}

Updated trunk/AE-go_GameServer/data/scripts/system/handlers/quest/ascension/_2008Ascension.java Download diff

10021003
124
		if(monster.getLifeStats().getCurrentHp() < monster.getLifeStats().getMaxHp() / 2)
124
		if(monster.getLifeStats().getCurrentHp() < monster.getLifeStats().getMaxHp() / 2)
125
		{
125
		{
126
			PacketSendUtility.sendPacket(player, new SM_PLAY_MOVIE(0, 152));
126
			PacketSendUtility.sendPacket(player, new SM_PLAY_MOVIE(0, 152));
127
			monster.getController().onDie();
127
			monster.getController().onDelete();
128
		}
128
		}
129
		return false;
129
		return false;
130
	}
130
	}
...
...
298
							}
298
							}
299
							activePlayerId = player.getObjectId();
299
							activePlayerId = player.getObjectId();
300
							for(Npc mob : mobs)
300
							for(Npc mob : mobs)
301
								mob.getController().onDie();
301
								mob.getController().onDelete();
302
							mobs.clear();
302
							mobs.clear();
303
							PacketSendUtility.sendPacket(player, new SM_EMOTION(player, 6, 3001, 0));
303
							PacketSendUtility.sendPacket(player, new SM_EMOTION(player, 6, 3001, 0));
304
							qs.getQuestVars().setQuestVar(50);
304
							qs.getQuestVars().setQuestVar(50);

Updated trunk/AE-go_GameServer/src/com/aionemu/gameserver/ai/events/handler/DayTimeChangeEventHandler.java Download diff

10021003
60
		}
60
		}
61
		else if(!spawnTime.isAllowedDuring(dayTime) && !spawn.isResting(instanceId))
61
		else if(!spawnTime.isAllowedDuring(dayTime) && !spawn.isResting(instanceId))
62
		{
62
		{
63
			DecayService.getInstance().scheduleDecayTask(owner);
63
			owner.getController().onDespawn(true);
64
			spawn.setResting(true, instanceId);
64
			spawn.setResting(true, instanceId);
65
		}
65
		}
66
	}
66
	}

Updated trunk/AE-go_GameServer/src/com/aionemu/gameserver/controllers/ActionitemController.java Download diff

10021003
67
		Player target = (Player) getOwner().getTarget();
67
		Player target = (Player) getOwner().getTarget();
68
		PacketSendUtility.broadcastPacket(getOwner(), new SM_EMOTION(getOwner(), 13, 0, target == null?0:target.getObjectId()));
68
		PacketSendUtility.broadcastPacket(getOwner(), new SM_EMOTION(getOwner(), 13, 0, target == null?0:target.getObjectId()));
69
		this.doDrop(target);
69
		this.doDrop(target);
70
		if(decayTask == null)
71
		{
72
			decayTask = DecayService.getInstance().scheduleDecayTask(this.getOwner());
73
			RespawnService.getInstance().scheduleRespawnTask(this.getOwner());
74
		}	
75
		
70
		
76
		//deselect target at the end
71
		//deselect target at the end
77
		getOwner().setTarget(null);
72
		getOwner().setTarget(null);

Updated trunk/AE-go_GameServer/src/com/aionemu/gameserver/controllers/MonsterController.java Download diff

10021003
38
import com.aionemu.gameserver.network.aion.serverpackets.SM_ATTACK_STATUS.TYPE;
38
import com.aionemu.gameserver.network.aion.serverpackets.SM_ATTACK_STATUS.TYPE;
39
import com.aionemu.gameserver.questEngine.QuestEngine;
39
import com.aionemu.gameserver.questEngine.QuestEngine;
40
import com.aionemu.gameserver.questEngine.model.QuestEnv;
40
import com.aionemu.gameserver.questEngine.model.QuestEnv;
41
import com.aionemu.gameserver.services.DecayService;
42
import com.aionemu.gameserver.services.RespawnService;
43
import com.aionemu.gameserver.utils.PacketSendUtility;
41
import com.aionemu.gameserver.utils.PacketSendUtility;
44
import com.aionemu.gameserver.utils.stats.StatFunctions;
42
import com.aionemu.gameserver.utils.stats.StatFunctions;
45
import com.aionemu.gameserver.world.World;
43
import com.aionemu.gameserver.world.World;
...
...
195
		this.doReward(target);
193
		this.doReward(target);
196
		this.doDrop(target);
194
		this.doDrop(target);
197
		this.getOwner().getAi().handleEvent(Event.DIED);
195
		this.getOwner().getAi().handleEvent(Event.DIED);
198
		
199
		if(decayTask == null)
200
		{
201
			decayTask = DecayService.getInstance().scheduleDecayTask(this.getOwner());
202
			RespawnService.getInstance().scheduleRespawnTask(this.getOwner());
203
		}	
204
196
205
		//deselect target at the end
197
		//deselect target at the end
206
		getOwner().setTarget(null);
198
		getOwner().setTarget(null);

Updated trunk/AE-go_GameServer/src/com/aionemu/gameserver/controllers/NpcController.java Download diff

10021003
18
18
19
import java.util.concurrent.Future;
19
import java.util.concurrent.Future;
20
20
21
import com.aionemu.gameserver.ai.events.Event;
21
import com.aionemu.gameserver.model.gameobjects.Npc;
22
import com.aionemu.gameserver.model.gameobjects.Npc;
22
import com.aionemu.gameserver.model.gameobjects.player.Player;
23
import com.aionemu.gameserver.model.gameobjects.player.Player;
23
import com.aionemu.gameserver.model.gameobjects.state.CreatureState;
24
import com.aionemu.gameserver.model.gameobjects.state.CreatureState;
24
import com.aionemu.gameserver.model.gameobjects.stats.NpcLifeStats;
25
import com.aionemu.gameserver.model.gameobjects.stats.NpcLifeStats;
26
import com.aionemu.gameserver.network.aion.serverpackets.SM_DELETE;
25
import com.aionemu.gameserver.network.aion.serverpackets.SM_DIALOG_WINDOW;
27
import com.aionemu.gameserver.network.aion.serverpackets.SM_DIALOG_WINDOW;
26
import com.aionemu.gameserver.questEngine.QuestEngine;
28
import com.aionemu.gameserver.questEngine.QuestEngine;
27
import com.aionemu.gameserver.questEngine.model.QuestEnv;
29
import com.aionemu.gameserver.questEngine.model.QuestEnv;
30
import com.aionemu.gameserver.services.DecayService;
28
import com.aionemu.gameserver.services.DropService;
31
import com.aionemu.gameserver.services.DropService;
32
import com.aionemu.gameserver.services.RespawnService;
29
import com.aionemu.gameserver.utils.PacketSendUtility;
33
import com.aionemu.gameserver.utils.PacketSendUtility;
30
34
31
/**
35
/**
...
...
53
		this.getOwner().setState(CreatureState.NPC_IDLE);
57
		this.getOwner().setState(CreatureState.NPC_IDLE);
54
		this.getOwner().setLifeStats(new NpcLifeStats(getOwner()));
58
		this.getOwner().setLifeStats(new NpcLifeStats(getOwner()));
55
	}
59
	}
60
	
61
	public void onDespawn(boolean forced)
62
	{
63
		if(forced && decayTask != null)
64
			decayTask.cancel(true);
65
		
66
		Npc owner = getOwner();
67
		if(owner == null || !owner.isSpawned())
68
			return;
69
			
70
		PacketSendUtility.broadcastPacket(owner, new SM_DELETE(owner));
71
		owner.getAi().handleEvent(Event.DESPAWN);
72
		owner.getPosition().getWorld().despawn(owner);	
73
		decayTask = null;
74
	}
75
	
76
	@Override
77
	public void onDie()
78
	{
79
		super.onDie();
80
		if(decayTask == null)
81
		{
82
			decayTask = DecayService.getInstance().scheduleDecayTask(this.getOwner());
83
		}		
84
		int instanceId = getOwner().getInstanceId();
85
		if(getOwner().getSpawn().isRespawn(instanceId))
86
		{
87
			RespawnService.getInstance().scheduleRespawnTask(this.getOwner());
88
		}
89
	}
56
90
57
	@Override
91
	@Override
58
	public Npc getOwner()
92
	public Npc getOwner()
...
...
69
		PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(getOwner().getObjectId(), 10));
103
		PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(getOwner().getObjectId(), 10));
70
	}
104
	}
71
	
105
	
106
	/**
107
	 * This method should be caleed to make forced despawn of NPC and delete it from the world
108
	 */
109
	public void onDelete()
110
	{
111
		this.onDespawn(true);
112
		this.delete();
113
	}
72
}
114
}

Updated trunk/AE-go_GameServer/src/com/aionemu/gameserver/controllers/VisibleObjectController.java Download diff

10021003
85
		 */
85
		 */
86
		if(getOwner().isSpawned())
86
		if(getOwner().isSpawned())
87
			world.despawn(getOwner());
87
			world.despawn(getOwner());
88
		else
89
			log.error("Attempt to remove from world not spawned object");
90
		/**
88
		/**
91
		 * Delete object from World.
89
		 * Delete object from World.
92
		 */
90
		 */

Updated trunk/AE-go_GameServer/src/com/aionemu/gameserver/model/gameobjects/Npc.java Download diff

10021003
17
package com.aionemu.gameserver.model.gameobjects;
17
package com.aionemu.gameserver.model.gameobjects;
18
18
19
import com.aionemu.gameserver.ai.npcai.NpcAi;
19
import com.aionemu.gameserver.ai.npcai.NpcAi;
20
import com.aionemu.gameserver.controllers.CreatureController;
20
import com.aionemu.gameserver.controllers.NpcController;
21
import com.aionemu.gameserver.controllers.NpcController;
21
import com.aionemu.gameserver.dataholders.DataManager;
22
import com.aionemu.gameserver.dataholders.DataManager;
22
import com.aionemu.gameserver.model.gameobjects.stats.NpcGameStats;
23
import com.aionemu.gameserver.model.gameobjects.stats.NpcGameStats;
...
...
109
	{
110
	{
110
		return (NpcAi) super.getAi();
111
		return (NpcAi) super.getAi();
111
	}
112
	}
112
	
113
		
114
	@Override
115
	public NpcController getController()
116
	{
117
		return (NpcController) super.getController();
118
	}
119
113
	public boolean hasWalkRoutes()
120
	public boolean hasWalkRoutes()
114
	{
121
	{
115
		return getSpawn().getWalkerId() > 0;
122
		return getSpawn().getWalkerId() > 0;

Updated trunk/AE-go_GameServer/src/com/aionemu/gameserver/services/DecayService.java Download diff

10021003
1
/*
1
/*
2
 * This file is part of aion-unique <aion-unique.smfnew.com>.
2
 * This file is part of aion-unique <aion-unique.org>.
3
 *
3
 *
4
 *  aion-unique is free software: you can redistribute it and/or modify
4
 *  aion-unique is free software: you can redistribute it and/or modify
5
 *  it under the terms of the GNU General Public License as published by
5
 *  it under the terms of the GNU General Public License as published by
...
...
18
18
19
import java.util.concurrent.Future;
19
import java.util.concurrent.Future;
20
20
21
import com.aionemu.gameserver.ai.events.Event;
22
import com.aionemu.gameserver.model.gameobjects.Npc;
21
import com.aionemu.gameserver.model.gameobjects.Npc;
23
import com.aionemu.gameserver.network.aion.serverpackets.SM_DELETE;
24
import com.aionemu.gameserver.utils.PacketSendUtility;
25
import com.aionemu.gameserver.utils.ThreadPoolManager;
22
import com.aionemu.gameserver.utils.ThreadPoolManager;
26
import com.aionemu.gameserver.world.World;
27
23
28
/**
24
/**
29
 * @author ATracer
25
 * @author ATracer
...
...
37
	
33
	
38
	public Future<?> scheduleDecayTask(final Npc npc)
34
	public Future<?> scheduleDecayTask(final Npc npc)
39
	{
35
	{
40
		final World world = npc.getPosition().getWorld();
41
		//TODO separate thread executor for decay/spawns
42
		// or schedule separate decay runnable service with queue 
43
		return ThreadPoolManager.getInstance().schedule(new Runnable()
36
		return ThreadPoolManager.getInstance().schedule(new Runnable()
44
		{
37
		{
45
			@Override
38
			@Override
46
			public void run()
39
			public void run()
47
			{
40
			{
48
				if(!npc.isSpawned())
41
				npc.getController().onDespawn(false);
49
					return;
50
				
51
				npc.getAi().handleEvent(Event.DESPAWN);
52
				PacketSendUtility.broadcastPacket(npc, new SM_DELETE(npc));
53
				world.despawn(npc);	
54
			}
42
			}
55
		}, DECAY_DEFAULT_DELAY);
43
		}, DECAY_DEFAULT_DELAY);
56
57
	}
44
	}
58
	
45
	
59
	public static DecayService getInstance()
46
	public static DecayService getInstance()

Updated trunk/AE-go_GameServer/src/com/aionemu/gameserver/services/DropService.java Download diff

10021003
225
		{
225
		{
226
			PacketSendUtility.sendPacket(player, new SM_LOOT_STATUS(npcId, 3));
226
			PacketSendUtility.sendPacket(player, new SM_LOOT_STATUS(npcId, 3));
227
			PacketSendUtility.broadcastPacket(player, new SM_EMOTION(player, 36, 0, 0), true);
227
			PacketSendUtility.broadcastPacket(player, new SM_EMOTION(player, 36, 0, 0), true);
228
			Creature creature = (Creature) world.findAionObject(npcId);
228
			Npc npc = (Npc) world.findAionObject(npcId);
229
			if(creature != null)
229
			if(npc != null)
230
			{
230
			{
231
				PacketSendUtility.broadcastPacket(creature, new SM_DELETE(creature));
231
				npc.getController().onDespawn(true);
232
			}
232
			}
233
234
			//TODO send 7B ??
235
			//7B 54 38 00 00 0D 00 00 00 00 00 00
236
			// or
237
			//7B 54 38 00 00 0E 00 00 00 00 00 00
238
		}
233
		}
239
	}
234
	}
240
}
235
}