Changeset 1006

User picture

Author: ATracer

(2010/02/08 23:30) About 2 years ago

- Experimental instance support for Ascension quest. Now every player should get own instance for passing this quest. Later will be added instance support for other zones. Was tested with 2 players only.
- Removed channels from Verteron and Altgard. It's up to PS admin to configure number of channels. 

Affected files

Updated trunk/AE-go_GameServer/data/scripts/system/handlers/admincommands/MovePlayerToPlayer.java Download diff

10051006
82
			return;
82
			return;
83
		}
83
		}
84
84
85
		playerToMove.getController().teleportTo(playerDestination.getWorldId(), playerDestination.getX(), playerDestination.getY(), playerDestination.getZ(),
playerDestination.getHeading(), 0);
85
		playerToMove.getController().teleportTo(playerDestination.getWorldId(), playerDestination.getInstanceId(), playerDestination.getX(), playerDestination.getY(), playerDestination.getZ(), playerDestination.getHeading(), 0);
86
		
86
		
87
		PacketSendUtility.sendMessage(admin, "Teleported player " + playerToMove.getName() + " to the location of player " +
playerDestination.getName() + ".");
87
		PacketSendUtility.sendMessage(admin, "Teleported player " + playerToMove.getName() + " to the location of player " +
playerDestination.getName() + ".");
88
		PacketSendUtility.sendMessage(playerToMove, "You have been teleported by an administrator.");
88
		PacketSendUtility.sendMessage(playerToMove, "You have been teleported by an administrator.");

Updated trunk/AE-go_GameServer/data/scripts/system/handlers/admincommands/MoveToMe.java Download diff

10051006
76
			return;
76
			return;
77
		}
77
		}
78
78
79
		playerToMove.getController().teleportTo(admin.getWorldId(), admin.getX(), admin.getY(), admin.getZ(), admin.getHeading(), 0);
79
		playerToMove.getController().teleportTo(admin.getWorldId(), admin.getInstanceId(), admin.getX(), admin.getY(), admin.getZ(), admin.getHeading(), 0);
80
		PacketSendUtility.sendMessage(admin, "Teleported player " + playerToMove.getName() + " to your location.");
80
		PacketSendUtility.sendMessage(admin, "Teleported player " + playerToMove.getName() + " to your location.");
81
		PacketSendUtility.sendMessage(playerToMove, "You have been teleported by " + admin.getName() + ".");
81
		PacketSendUtility.sendMessage(playerToMove, "You have been teleported by " + admin.getName() + ".");
82
	}
82
	}

Updated trunk/AE-go_GameServer/data/scripts/system/handlers/admincommands/MoveToPlayer.java Download diff

10051006
76
			return;
76
			return;
77
		}
77
		}
78
78
79
		admin.getController().teleportTo(player.getWorldId(), player.getX(), player.getY(), player.getZ(), player.getHeading(), 0);
79
		admin.getController().teleportTo(player.getWorldId(), player.getInstanceId(), player.getX(), player.getY(), player.getZ(), player.getHeading(), 0);
80
		PacketSendUtility.sendMessage(admin, "Teleported to player " + player.getName() + ".");
80
		PacketSendUtility.sendMessage(admin, "Teleported to player " + player.getName() + ".");
81
	}
81
	}
82
}
82
}

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

10051006
17
package quest.ascension;
17
package quest.ascension;
18
18
19
import java.util.ArrayList;
19
import java.util.ArrayList;
20
import java.util.HashMap;
20
import java.util.List;
21
import java.util.List;
22
import java.util.Map;
21
23
22
import com.aionemu.gameserver.ai.events.Event;
24
import com.aionemu.gameserver.ai.events.Event;
23
import com.aionemu.gameserver.configs.Config;
25
import com.aionemu.gameserver.configs.Config;
...
...
49
public class _1006Ascension extends QuestHandler
51
public class _1006Ascension extends QuestHandler
50
{
52
{
51
	private final static int	questId			= 1006;
53
	private final static int	questId			= 1006;
52
	private int					activePlayerId	= 0;
54
	//TODO [ATracer] - do we really need activePlayer ids in script body ???
53
	private List<Npc>			mobs			= new ArrayList<Npc>();
55
	private Map<Integer, Integer> activePlayers = new HashMap<Integer, Integer>();
56
	private Map<Integer, List<Npc>> mobs = new HashMap<Integer, List<Npc>>();
54
57
55
	public _1006Ascension()
58
	public _1006Ascension()
56
	{
59
	{
...
...
71
	public boolean onKillEvent(QuestEnv env)
74
	public boolean onKillEvent(QuestEnv env)
72
	{
75
	{
73
		Player player = env.getPlayer();
76
		Player player = env.getPlayer();
77
		int instanceId = player.getInstanceId();
74
		QuestState qs = player.getQuestStateList().getQuestState(questId);
78
		QuestState qs = player.getQuestStateList().getQuestState(questId);
75
		if(qs == null || qs.getStatus() != QuestStatus.START)
79
		if(qs == null || qs.getStatus() != QuestStatus.START)
76
			return false;
80
			return false;
...
...
86
			{
90
			{
87
				qs.getQuestVars().setQuestVar(qs.getQuestVars().getQuestVars() + 1);
91
				qs.getQuestVars().setQuestVar(qs.getQuestVars().getQuestVars() + 1);
88
				updateQuestStatus(player, qs);
92
				updateQuestStatus(player, qs);
89
				if(mobs.contains(env.getVisibleObject()))
93
				removeMobToInstance(instanceId, (Npc) env.getVisibleObject());
90
					mobs.remove(env.getVisibleObject());
91
				return true;
94
				return true;
92
			}
95
			}
93
			else if(var == 54)
96
			else if(var == 54)
94
			{
97
			{
95
				qs.getQuestVars().setQuestVar(4);
98
				qs.getQuestVars().setQuestVar(4);
96
				updateQuestStatus(player, qs);
99
				updateQuestStatus(player, qs);
97
				Monster mob = (Monster) QuestEngine.getInstance().addNewSpawn(310010000, 211043, (float) 226.7,
100
				Monster mob = (Monster) QuestEngine.getInstance().addNewSpawn(310010000, instanceId, 211043, (float) 226.7,
98
					(float) 251.5, (float) 205.5, (byte) 0, false);
101
					(float) 251.5, (float) 205.5, (byte) 0, false);
99
				//TODO: Tempt decrease P attack.
102
				//TODO: Tempt decrease P attack.
100
				mob.getGameStats().setStat(StatEnum.MAIN_HAND_POWER, mob.getGameStats().getCurrentStat(StatEnum.MAIN_HAND_POWER)/3 );
103
				mob.getGameStats().setStat(StatEnum.MAIN_HAND_POWER, mob.getGameStats().getCurrentStat(StatEnum.MAIN_HAND_POWER)/3 );
101
				mob.getAggroList().addDamageHate(player, 1000, 0);
104
				mob.getAggroList().addDamageHate(player, 1000, 0);
102
				mob.getAi().handleEvent(Event.ATTACKED);
105
				mob.getAi().handleEvent(Event.ATTACKED);
103
				mobs.add(mob);
106
				addMobToInstance(instanceId, mob);
104
				return true;
107
				return true;
105
			}
108
			}
106
		}
109
		}
...
...
111
	public boolean onDialogEvent(QuestEnv env)
114
	public boolean onDialogEvent(QuestEnv env)
112
	{
115
	{
113
		final Player player = env.getPlayer();
116
		final Player player = env.getPlayer();
117
		final int instanceId = player.getInstanceId();
114
		final QuestState qs = player.getQuestStateList().getQuestState(questId);
118
		final QuestState qs = player.getQuestStateList().getQuestState(questId);
115
		if(qs == null)
119
		if(qs == null)
116
			return false;
120
			return false;
...
...
152
							updateQuestStatus(player, qs);
156
							updateQuestStatus(player, qs);
153
							PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(env.getVisibleObject()
157
							PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(env.getVisibleObject()
154
								.getObjectId(), 0));
158
								.getObjectId(), 0));
155
							player.getController().teleportTo(310010000, 52, 174, 229, 0);
159
							int newInstanceId = player.getPosition().getWorld().getNextAvailableInstanceId(310010000);
160
							player.getController().teleportTo(310010000, newInstanceId, 52, 174, 229, 0);
156
							return true;
161
							return true;
157
						}
162
						}
158
					case 10003:
163
					case 10003:
...
...
232
					case 25:
237
					case 25:
233
						if(var == 99)
238
						if(var == 99)
234
						{
239
						{
235
							if(activePlayerId != 0 && activePlayerId != player.getObjectId())
240
							if(activePlayers.get(instanceId) != null && activePlayers.get(instanceId) != player.getObjectId())
236
							{
241
							{
237
								World world = player.getActiveRegion().getWorld();
242
								World world = player.getActiveRegion().getWorld();
238
								Player activePlayer = world.findPlayer(activePlayerId);
243
								Player activePlayer = world.findPlayer(activePlayers.get(instanceId));
239
								if(!(activePlayer == null || !activePlayer.isOnline() || activePlayer.getWorldId() != 310010000))
244
								if(!(activePlayer == null || !activePlayer.isOnline() || activePlayer.getWorldId() != 310010000))
240
									return false;
245
									return false;
241
							}
246
							}
242
							activePlayerId = player.getObjectId();
247
							activePlayers.put(instanceId, player.getObjectId());
243
							for(Npc mob : mobs)
248
							clearMobsInInstance(instanceId);
244
							{
245
								mob.getController().onDelete();
246
							}
247
							mobs.clear();
248
							PacketSendUtility.sendPacket(player, new SM_EMOTION(player, 6, 1001, 0));
249
							PacketSendUtility.sendPacket(player, new SM_EMOTION(player, 6, 1001, 0));
249
							qs.getQuestVars().setQuestVar(50);
250
							qs.getQuestVars().setQuestVar(50);
250
							updateQuestStatus(player, qs);
251
							updateQuestStatus(player, qs);
...
...
254
								{
255
								{
255
									qs.getQuestVars().setQuestVar(51);
256
									qs.getQuestVars().setQuestVar(51);
256
									updateQuestStatus(player, qs);
257
									updateQuestStatus(player, qs);
257
									mobs.add((Monster) QuestEngine.getInstance().addNewSpawn(310010000, 211042,
258
									addMobToInstance(instanceId, (Monster) QuestEngine.getInstance().addNewSpawn(310010000, instanceId, 211042,
258
										(float) 224.073, (float) 239.1, (float) 206.7, (byte) 0, false));
259
										(float) 224.073, (float) 239.1, (float) 206.7, (byte) 0, false));
259
									mobs.add((Monster) QuestEngine.getInstance().addNewSpawn(310010000, 211042,
260
									addMobToInstance(instanceId, (Monster) QuestEngine.getInstance().addNewSpawn(310010000, instanceId, 211042,
260
										(float) 233.5, (float) 241.04, (float) 206.365, (byte) 0, false));
261
										(float) 233.5, (float) 241.04, (float) 206.365, (byte) 0, false));
261
									mobs.add((Monster) QuestEngine.getInstance().addNewSpawn(310010000, 211042,
262
									addMobToInstance(instanceId, (Monster) QuestEngine.getInstance().addNewSpawn(310010000, instanceId, 211042,
262
										(float) 229.6, (float) 265.7, (float) 205.7, (byte) 0, false));
263
										(float) 229.6, (float) 265.7, (float) 205.7, (byte) 0, false));
263
									mobs.add((Monster) QuestEngine.getInstance().addNewSpawn(310010000, 211042,
264
									addMobToInstance(instanceId, (Monster) QuestEngine.getInstance().addNewSpawn(310010000, instanceId, 211042,
264
										(float) 222.8, (float) 262.5, (float) 205.7, (byte) 0, false));
265
										(float) 222.8, (float) 262.5, (float) 205.7, (byte) 0, false));
265
									for(Npc mob : mobs)
266
									List<Npc> monsters = mobs.get(instanceId);
267
									for(Npc mob : monsters)
266
									{
268
									{
267
										//TODO: Tempt decrease P attack.
269
										//TODO: Tempt decrease P attack.
268
										mob.getGameStats().setStat(StatEnum.MAIN_HAND_POWER, mob.getGameStats().getCurrentStat(StatEnum.MAIN_HAND_POWER)/3 );
270
										mob.getGameStats().setStat(StatEnum.MAIN_HAND_POWER, mob.getGameStats().getCurrentStat(StatEnum.MAIN_HAND_POWER)/3 );
...
...
293
	public boolean onLvlUpEvent(QuestEnv env)
295
	public boolean onLvlUpEvent(QuestEnv env)
294
	{
296
	{
295
		Player player = env.getPlayer();
297
		Player player = env.getPlayer();
298
		int instanceId = player.getInstanceId();
296
		QuestState qs = player.getQuestStateList().getQuestState(questId);
299
		QuestState qs = player.getQuestStateList().getQuestState(questId);
297
		if(qs != null)
300
		if(qs != null)
298
		{
301
		{
...
...
301
			int var = qs.getQuestVars().getQuestVars();
304
			int var = qs.getQuestVars().getQuestVars();
302
			if(var == 4 || (var >= 50 && var <= 55))
305
			if(var == 4 || (var >= 50 && var <= 55))
303
			{
306
			{
304
				if(activePlayerId == player.getObjectId() && player.getWorldId() == 310010000)
307
				if(activePlayers.get(instanceId) != null 
308
					&& activePlayers.get(instanceId)== player.getObjectId()
309
					&& player.getWorldId() == 310010000)
305
					return false;
310
					return false;
306
				else
311
				else
307
				{
312
				{
...
...
379
		if(movieId != 151)
384
		if(movieId != 151)
380
			return false;
385
			return false;
381
		Player player = env.getPlayer();
386
		Player player = env.getPlayer();
387
		int instanceId = player.getInstanceId();
382
		QuestState qs = player.getQuestStateList().getQuestState(questId);
388
		QuestState qs = player.getQuestStateList().getQuestState(questId);
383
		if(qs == null || qs.getStatus() != QuestStatus.START || qs.getQuestVars().getQuestVars() != 4)
389
		if(qs == null || qs.getStatus() != QuestStatus.START || qs.getQuestVars().getQuestVars() != 4)
384
			return false;
390
			return false;
385
		mobs.add((Npc) QuestEngine.getInstance().addNewSpawn(310010000, 790001, (float) 220.6, (float) 247.8,
391
		addMobToInstance(instanceId, (Npc) QuestEngine.getInstance().addNewSpawn(310010000, instanceId, 790001, (float) 220.6, (float) 247.8,
386
			(float) 206.0, (byte) 0, false));
392
			(float) 206.0, (byte) 0, false));
387
		qs.getQuestVars().setQuestVar(5);
393
		qs.getQuestVars().setQuestVar(5);
388
		updateQuestStatus(player, qs);
394
		updateQuestStatus(player, qs);
...
...
399
		sendQuestDialog(player, env.getVisibleObject().getObjectId(), 5);
405
		sendQuestDialog(player, env.getVisibleObject().getObjectId(), 5);
400
		return true;
406
		return true;
401
	}
407
	}
408
	
409
	/**
410
	 * 
411
	 * @param instanceId
412
	 * @param npc
413
	 */
414
	private void addMobToInstance(int instanceId, Npc npc)
415
	{
416
		List<Npc> mobList = mobs.get(instanceId);
417
		if(mobList == null)
418
		{
419
			mobList = new ArrayList<Npc>();
420
			mobs.put(instanceId, mobList);
421
		}
422
			
423
		mobList.add(npc);		
424
	}
425
	
426
	/**
427
	 * 
428
	 * @param instanceId
429
	 * @param npc
430
	 */
431
	private void removeMobToInstance(int instanceId, Npc npc)
432
	{
433
		List<Npc> mobList = mobs.get(instanceId);
434
		if(mobList != null && mobList.contains(npc))
435
			mobList.remove(npc);		
436
	}
437
	
438
	/**
439
	 * 
440
	 * @param instanceId
441
	 */
442
	private void clearMobsInInstance(int instanceId)
443
	{
444
		List<Npc> mobList = mobs.get(instanceId);
445
		if(mobList != null)
446
		{
447
			for(Npc npc : mobList)
448
			{
449
				npc.getController().onDelete();
450
			}
451
			mobList.clear();	
452
		}				
453
	}
402
}
454
}

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

10051006
17
package quest.ascension;
17
package quest.ascension;
18
18
19
import java.util.ArrayList;
19
import java.util.ArrayList;
20
import java.util.HashMap;
20
import java.util.List;
21
import java.util.List;
22
import java.util.Map;
21
23
22
import com.aionemu.gameserver.ai.events.Event;
24
import com.aionemu.gameserver.ai.events.Event;
23
import com.aionemu.gameserver.configs.Config;
25
import com.aionemu.gameserver.configs.Config;
...
...
48
{
50
{
49
51
50
	private final static int	questId			= 2008;
52
	private final static int	questId			= 2008;
51
	private int					activePlayerId	= 0;
53
	//TODO [ATracer] - do we really need activePlayer ids in script body ???
52
	private List<Npc>			mobs			= new ArrayList<Npc>();
54
	private Map<Integer, Integer> activePlayers = new HashMap<Integer, Integer>();
55
	private Map<Integer, List<Npc>>			mobs			= new HashMap<Integer, List<Npc>>();
53
	
56
	
54
	@Inject
57
	@Inject
55
	public _2008Ascension(SpawnsData spawnsData)
58
	public _2008Ascension(SpawnsData spawnsData)
...
...
72
	public boolean onKillEvent(QuestEnv env)
75
	public boolean onKillEvent(QuestEnv env)
73
	{
76
	{
74
		Player player = env.getPlayer();
77
		Player player = env.getPlayer();
78
		int instanceId = player.getInstanceId();
75
		QuestState qs = player.getQuestStateList().getQuestState(questId);
79
		QuestState qs = player.getQuestStateList().getQuestState(questId);
76
		if(qs == null || qs.getStatus() != QuestStatus.START)
80
		if(qs == null || qs.getStatus() != QuestStatus.START)
77
			return false;
81
			return false;
...
...
87
			{
91
			{
88
				qs.getQuestVars().setQuestVar(qs.getQuestVars().getQuestVars() + 1);
92
				qs.getQuestVars().setQuestVar(qs.getQuestVars().getQuestVars() + 1);
89
				updateQuestStatus(player, qs);
93
				updateQuestStatus(player, qs);
90
				if(mobs.contains(env.getVisibleObject()))
94
				removeMobToInstance(instanceId, (Npc) env.getVisibleObject());;
91
					mobs.remove(env.getVisibleObject());
92
				return true;
95
				return true;
93
			}
96
			}
94
			else if(var == 54)
97
			else if(var == 54)
95
			{
98
			{
96
				qs.getQuestVars().setQuestVar(5);
99
				qs.getQuestVars().setQuestVar(5);
97
				updateQuestStatus(player, qs);
100
				updateQuestStatus(player, qs);
98
				Monster mob = (Monster) QuestEngine.getInstance().addNewSpawn(320010000, 205041, 301f,
101
				Monster mob = (Monster) QuestEngine.getInstance().addNewSpawn(320010000, instanceId, 205041, 301f,
99
					259f, 205.5f, (byte) 0, false);
102
					259f, 205.5f, (byte) 0, false);
100
				//TODO: Tempt decrease P attack.
103
				//TODO: Tempt decrease P attack.
101
				mob.getGameStats().setStat(StatEnum.MAIN_HAND_POWER, mob.getGameStats().getCurrentStat(StatEnum.MAIN_HAND_POWER)/3 );
104
				mob.getGameStats().setStat(StatEnum.MAIN_HAND_POWER, mob.getGameStats().getCurrentStat(StatEnum.MAIN_HAND_POWER)/3 );
102
				(mob).getAggroList().addDamageHate(player, 1000, 0);
105
				(mob).getAggroList().addDamageHate(player, 1000, 0);
103
				mob.getAi().handleEvent(Event.ATTACKED);
106
				mob.getAi().handleEvent(Event.ATTACKED);
104
				mobs.add(mob);
107
				addMobToInstance(instanceId, mob);
105
				return true;
108
				return true;
106
			}
109
			}
107
		}
110
		}
...
...
133
	public boolean onDialogEvent(QuestEnv env)
136
	public boolean onDialogEvent(QuestEnv env)
134
	{
137
	{
135
		final Player player = env.getPlayer();
138
		final Player player = env.getPlayer();
139
		final int instanceId = player.getInstanceId();
136
		final QuestState qs = player.getQuestStateList().getQuestState(questId);
140
		final QuestState qs = player.getQuestStateList().getQuestState(questId);
137
		if(qs == null)
141
		if(qs == null)
138
			return false;
142
			return false;
...
...
180
							updateQuestStatus(player, qs);
184
							updateQuestStatus(player, qs);
181
							PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(env.getVisibleObject()
185
							PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(env.getVisibleObject()
182
								.getObjectId(), 0));
186
								.getObjectId(), 0));
183
							player.getController().teleportTo(320010000, 457.65f, 426.8f, 230.4f, 0);
187
							int newInstanceId = player.getPosition().getWorld().getNextAvailableInstanceId(320010000);
188
							player.getController().teleportTo(320010000, newInstanceId, 457.65f, 426.8f, 230.4f, 0);
184
							return true;
189
							return true;
185
						}
190
						}
186
					case 10005:
191
					case 10005:
...
...
289
					case 25:
294
					case 25:
290
						if(var == 99)
295
						if(var == 99)
291
						{
296
						{
292
							if(activePlayerId != 0 && activePlayerId != player.getObjectId())
297
							if(activePlayers.get(instanceId) != null && activePlayers.get(instanceId) != player.getObjectId())
293
							{
298
							{
294
								World world = player.getActiveRegion().getWorld();
299
								World world = player.getActiveRegion().getWorld();
295
								Player activePlayer = world.findPlayer(activePlayerId);
300
								Player activePlayer = world.findPlayer(activePlayers.get(instanceId));
296
								if(!(activePlayer == null || !activePlayer.isOnline() || activePlayer.getWorldId() != 310010000))
301
								if(!(activePlayer == null || !activePlayer.isOnline() || activePlayer.getWorldId() != 310010000))
297
									return false;
302
									return false;
298
							}
303
							}
299
							activePlayerId = player.getObjectId();
304
							activePlayers.put(instanceId, player.getObjectId());
300
							for(Npc mob : mobs)
305
							clearMobsInInstance(instanceId);
301
								mob.getController().onDelete();
306
							
302
							mobs.clear();
303
							PacketSendUtility.sendPacket(player, new SM_EMOTION(player, 6, 3001, 0));
307
							PacketSendUtility.sendPacket(player, new SM_EMOTION(player, 6, 3001, 0));
304
							qs.getQuestVars().setQuestVar(50);
308
							qs.getQuestVars().setQuestVar(50);
305
							updateQuestStatus(player, qs);
309
							updateQuestStatus(player, qs);
...
...
309
								{
313
								{
310
									qs.getQuestVars().setQuestVar(51);
314
									qs.getQuestVars().setQuestVar(51);
311
									updateQuestStatus(player, qs);
315
									updateQuestStatus(player, qs);
312
									mobs.add((Monster) QuestEngine.getInstance().addNewSpawn(320010000, 205040,
316
									addMobToInstance(instanceId, (Monster) QuestEngine.getInstance().addNewSpawn(320010000, instanceId, 205040,
313
										294f, 277f, 207f, (byte) 0, false));
317
										294f, 277f, 207f, (byte) 0, false));
314
									mobs.add((Monster) QuestEngine.getInstance().addNewSpawn(320010000, 205040,
318
									addMobToInstance(instanceId, (Monster) QuestEngine.getInstance().addNewSpawn(320010000, instanceId, 205040,
315
										305f, 279f, 206.5f, (byte) 0, false));
319
										305f, 279f, 206.5f, (byte) 0, false));
316
									mobs.add((Monster) QuestEngine.getInstance().addNewSpawn(320010000, 205040,
320
									addMobToInstance(instanceId, (Monster) QuestEngine.getInstance().addNewSpawn(320010000, instanceId, 205040,
317
										298f, 253f, 205.7f, (byte) 0, false));
321
										298f, 253f, 205.7f, (byte) 0, false));
318
									mobs.add((Monster) QuestEngine.getInstance().addNewSpawn(320010000, 205040,
322
									addMobToInstance(instanceId, (Monster) QuestEngine.getInstance().addNewSpawn(320010000, instanceId, 205040,
319
										306f, 251f, 206f, (byte) 0, false));
323
										306f, 251f, 206f, (byte) 0, false));
320
									for(Npc mob : mobs)
324
									List<Npc> monsters = mobs.get(instanceId);
325
									for(Npc mob : monsters)
321
									{
326
									{
322
										//TODO: Tempt decrease P attack.
327
										//TODO: Tempt decrease P attack.
323
										mob.getGameStats().setStat(StatEnum.MAIN_HAND_POWER, mob.getGameStats().getCurrentStat(StatEnum.MAIN_HAND_POWER)/3 );
328
										mob.getGameStats().setStat(StatEnum.MAIN_HAND_POWER, mob.getGameStats().getCurrentStat(StatEnum.MAIN_HAND_POWER)/3 );
...
...
348
	public boolean onLvlUpEvent(QuestEnv env)
353
	public boolean onLvlUpEvent(QuestEnv env)
349
	{
354
	{
350
		Player player = env.getPlayer();
355
		Player player = env.getPlayer();
356
		int instanceId = player.getInstanceId();
351
		QuestState qs = player.getQuestStateList().getQuestState(questId);
357
		QuestState qs = player.getQuestStateList().getQuestState(questId);
352
		if(qs != null)
358
		if(qs != null)
353
		{
359
		{
...
...
356
			int var = qs.getQuestVars().getQuestVars();
362
			int var = qs.getQuestVars().getQuestVars();
357
			if(var == 5 || (var >= 50 && var <= 55))
363
			if(var == 5 || (var >= 50 && var <= 55))
358
			{
364
			{
359
				if(activePlayerId == player.getObjectId() && player.getWorldId() == 320010000)
365
				if(activePlayers.get(instanceId) != null 
366
					&& activePlayers.get(instanceId)== player.getObjectId()
367
					&& player.getWorldId() == 320010000)
360
					return false;
368
					return false;
361
				else
369
				else
362
				{
370
				{
...
...
386
		if(movieId != 152)
394
		if(movieId != 152)
387
			return false;
395
			return false;
388
		Player player = env.getPlayer();
396
		Player player = env.getPlayer();
397
		int instanceId = player.getInstanceId();
389
		QuestState qs = player.getQuestStateList().getQuestState(questId);
398
		QuestState qs = player.getQuestStateList().getQuestState(questId);
390
		if(qs == null || qs.getStatus() != QuestStatus.START || qs.getQuestVars().getQuestVars() != 5)
399
		if(qs == null || qs.getStatus() != QuestStatus.START || qs.getQuestVars().getQuestVars() != 5)
391
			return false;
400
			return false;
392
		mobs.add((Npc) QuestEngine.getInstance().addNewSpawn(320010000, 203550, 301.92999f, 274.26001f, 205.7f, (byte) 0, false));
401
		addMobToInstance(instanceId, (Npc) QuestEngine.getInstance().addNewSpawn(320010000, instanceId, 203550, 301.92999f, 274.26001f, 205.7f, (byte) 0, false));
393
		qs.getQuestVars().setQuestVar(6);
402
		qs.getQuestVars().setQuestVar(6);
394
		updateQuestStatus(player, qs);
403
		updateQuestStatus(player, qs);
395
		return true;
404
		return true;
...
...
405
		sendQuestDialog(player, env.getVisibleObject().getObjectId(), 5);
414
		sendQuestDialog(player, env.getVisibleObject().getObjectId(), 5);
406
		return true;
415
		return true;
407
	}
416
	}
417
	
418
	/**
419
	 * 
420
	 * @param instanceId
421
	 * @param npc
422
	 */
423
	private void addMobToInstance(int instanceId, Npc npc)
424
	{
425
		List<Npc> mobList = mobs.get(instanceId);
426
		if(mobList == null)
427
		{
428
			mobList = new ArrayList<Npc>();
429
			mobs.put(instanceId, mobList);
430
		}
431
		mobList.add(npc);		
432
	}
433
	
434
	/**
435
	 * 
436
	 * @param instanceId
437
	 * @param npc
438
	 */
439
	private void removeMobToInstance(int instanceId, Npc npc)
440
	{
441
		List<Npc> mobList = mobs.get(instanceId);
442
		if(mobList != null && mobList.contains(npc))
443
			mobList.remove(npc);		
444
	}
445
	
446
	/**
447
	 * 
448
	 * @param instanceId
449
	 */
450
	private void clearMobsInInstance(int instanceId)
451
	{
452
		List<Npc> mobList = mobs.get(instanceId);
453
		if(mobList != null)
454
		{
455
			for(Npc npc : mobList)
456
			{
457
				npc.getController().onDelete();
458
			}
459
			mobList.clear();	
460
		}				
461
	}
408
}
462
}

Updated trunk/AE-go_GameServer/data/static_data/world_maps.xml Download diff

10051006
4
	<map id="110010000" name="Sanctum" />
4
	<map id="110010000" name="Sanctum" />
5
	<map id="120010000" name="Pandaemonium" />
5
	<map id="120010000" name="Pandaemonium" />
6
	<map id="210010000" name="Poeta" max_user="200" twin_count="2"/>
6
	<map id="210010000" name="Poeta" max_user="200" twin_count="2"/>
7
	<map id="210030000" name="Verteron" max_user="200" twin_count="2" />
7
	<map id="210030000" name="Verteron" max_user="200"/>
8
	<map id="210020000" name="Eltnen" />
8
	<map id="210020000" name="Eltnen" />
9
	<map id="210060000" name="Theomobos" />
9
	<map id="210060000" name="Theomobos" />
10
	<map id="210040000" name="Heiron" />
10
	<map id="210040000" name="Heiron" />
11
	<map id="220010000" name="Ishalgen" max_user="200" twin_count="2" />
11
	<map id="220010000" name="Ishalgen" max_user="200" twin_count="2" />
12
	<map id="220030000" name="Altgard" max_user="200" twin_count="2"/>
12
	<map id="220030000" name="Altgard" max_user="200"/>
13
	<map id="220020000" name="Morheim" />
13
	<map id="220020000" name="Morheim" />
14
	<map id="220050000" name="Brusthonin" />
14
	<map id="220050000" name="Brusthonin" />
15
	<map id="220040000" name="Beluslan" />
15
	<map id="220040000" name="Beluslan" />
16
	
16
	
17
	<map id="300010000" name="IDAbPro" />
17
	<map id="300010000" name="IDAbPro" />
18
	<map id="310010000" twin_count="2" name="IDAbProL1" />
18
	<map id="310010000" name="IDAbProL1" />
19
	<map id="310020000" name="IDAbProL2" />
19
	<map id="310020000" name="IDAbProL2" />
20
	<map id="310030000" name="IDAbGateL1" />
20
	<map id="310030000" name="IDAbGateL1" />
21
	<map id="310040000" name="IDAbGateL2" />
21
	<map id="310040000" name="IDAbGateL2" />
...
...
25
	<map id="310080000" name="IDLC1_arena" />
25
	<map id="310080000" name="IDLC1_arena" />
26
	<map id="310090000" name="IDLF3_Castle_indratoo" />
26
	<map id="310090000" name="IDLF3_Castle_indratoo" />
27
	<map id="310100000" name="IDLF3_Castle_Lehpar" />
27
	<map id="310100000" name="IDLF3_Castle_Lehpar" />
28
	<map id="320010000" twin_count="2" name="IDAbProD1" />
28
	<map id="320010000" name="IDAbProD1" />
29
	<map id="320020000" name="IDAbProD2" />
29
	<map id="320020000" name="IDAbProD2" />
30
	<map id="320030000" name="IDAbGateD1" />
30
	<map id="320030000" name="IDAbGateD1" />
31
	<map id="320040000" name="IDAbGateD2" />
31
	<map id="320040000" name="IDAbGateD2" />

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

10051006
111
	}
111
	}
112
	
112
	
113
	/**
113
	/**
114
	 *  Teleport Creature to the location using current heading
114
	 *  Teleport Creature to the location using current heading and instanceId
115
	 *  
115
	 *  
116
	 * @param worldId
116
	 * @param worldId
117
	 * @param x
117
	 * @param x
...
...
122
	 */
122
	 */
123
	public boolean teleportTo(int worldId, float x, float y, float z, int delay)
123
	public boolean teleportTo(int worldId, float x, float y, float z, int delay)
124
	{		
124
	{		
125
		return teleportTo(worldId, x, y, z, getOwner().getHeading(), delay);
125
		int instanceId = 1;	
126
		if(getOwner().getWorldId() == worldId)
127
		{
128
			instanceId = getOwner().getInstanceId();
129
		}
130
		return teleportTo(worldId, instanceId, x, y, z, delay);
126
	}
131
	}
127
	
132
	
128
	/**
133
	/**
134
	 * 
135
	 * @param worldId
136
	 * @param instanceId
137
	 * @param x
138
	 * @param y
139
	 * @param z
140
	 * @param delay
141
	 * @return
142
	 */
143
	public boolean teleportTo(int worldId, int instanceId, float x, float y, float z, int delay)
144
	{		
145
		return teleportTo(worldId, instanceId, x, y, z, getOwner().getHeading(), delay);
146
	}
147
	
148
	/**
129
	 *  Teleport Creature to the location using specific heading
149
	 *  Teleport Creature to the location using specific heading
130
	 *  
150
	 *  
131
	 * @param worldId
151
	 * @param worldId
152
	 * @param instanceId
132
	 * @param x
153
	 * @param x
133
	 * @param y
154
	 * @param y
134
	 * @param z
155
	 * @param z
...
...
136
	 * @param delay
157
	 * @param delay
137
	 * @return
158
	 * @return
138
	 */
159
	 */
139
	public boolean teleportTo(int worldId, float x, float y, float z, byte heading, int delay)
160
	public boolean teleportTo(int worldId, int instanceId, float x, float y, float z, byte heading, int delay)
140
	{		
161
	{		
141
		return true;
162
		return true;
142
	}
163
	}

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

10051006
137
	{
137
	{
138
		Monster monster = getOwner();
138
		Monster monster = getOwner();
139
139
140
		if (monster == null || monster.getLifeStats().isAlreadyDead())
140
		if (monster == null || monster.getLifeStats().isAlreadyDead() || !monster.isSpawned())
141
			return;
141
			return;
142
		
142
		
143
		if(!monster.canAttack())
143
		if(!monster.canAttack())

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

10051006
295
	}
295
	}
296
296
297
	@Override
297
	@Override
298
	public boolean teleportTo(final int worldId, final float x,
298
	public boolean teleportTo(final int worldId, final int instanceId, final float x,
299
		final float y, final float z, final byte heading, final int delay)
299
		final float y, final float z, final byte heading, final int delay)
300
	{
300
	{
301
		final Player player = getOwner();
301
		final Player player = getOwner();
...
...
316
                }
316
                }
317
                World world = player.getActiveRegion().getWorld();
317
                World world = player.getActiveRegion().getWorld();
318
				world.despawn(player);
318
				world.despawn(player);
319
				world.setPosition(player, worldId, x, y, z, heading);
319
				world.setPosition(player, worldId, instanceId,  x, y, z, heading);
320
				player.setProtectionActive(true);
320
				player.setProtectionActive(true);
321
				PacketSendUtility.sendPacket(player, new SM_CHANNEL_INFO(player.getPosition()));	
321
				PacketSendUtility.sendPacket(player, new SM_CHANNEL_INFO(player.getPosition()));	
322
				PacketSendUtility.sendPacket(player, new SM_PLAYER_SPAWN(player));		
322
				PacketSendUtility.sendPacket(player, new SM_PLAYER_SPAWN(player));		

Updated trunk/AE-go_GameServer/src/com/aionemu/gameserver/questEngine/QuestEngine.java Download diff

10051006
287
		itemService.addItem(player, itemId, count, false);
287
		itemService.addItem(player, itemId, count, false);
288
	}
288
	}
289
289
290
	public VisibleObject addNewSpawn(int worldId, int templateId, float x, float y, float z, byte heading, boolean respawn)
290
	public VisibleObject addNewSpawn(int worldId, int instanceId, int templateId, float x, float y, float z, byte heading, boolean respawn)
291
	{
291
	{
292
		SpawnTemplate spawn = spawnEngine.addNewSpawn(worldId, 1, templateId, x, y, z, heading, 0, 0, respawn);
292
		SpawnTemplate spawn = spawnEngine.addNewSpawn(worldId, instanceId, templateId, x, y, z, heading, 0, 0, respawn);
293
		return spawnEngine.spawnObject(spawn, 1);
293
		return spawnEngine.spawnObject(spawn, instanceId);
294
	}
294
	}
295
295
296
	public void clear()
296
	public void clear()

Updated trunk/AE-go_GameServer/src/com/aionemu/gameserver/spawnengine/SpawnEngine.java Download diff

10051006
305
		});
305
		});
306
	}
306
	}
307
307
308
	private void spawnInstance(int worldId, int instanceIndex)
308
	/**
309
	 * 
310
	 * @param worldId
311
	 * @param instanceIndex
312
	 */
313
	public void spawnInstance(int worldId, int instanceIndex)
309
	{	
314
	{	
310
315
311
		List<SpawnGroup> worldSpawns = spawnsData.getSpawnsForWorld(worldId);
316
		List<SpawnGroup> worldSpawns = spawnsData.getSpawnsForWorld(worldId);

Updated trunk/AE-go_GameServer/src/com/aionemu/gameserver/world/MapRegion.java Download diff

10051006
24
import javolution.util.FastMap;
24
import javolution.util.FastMap;
25
25
26
import com.aionemu.gameserver.model.gameobjects.VisibleObject;
26
import com.aionemu.gameserver.model.gameobjects.VisibleObject;
27
import com.aionemu.gameserver.model.gameobjects.player.Player;
27
28
28
/**
29
/**
29
 * Just some part of map.
30
 * Just some part of map.
...
...
136
	void add(VisibleObject object)
137
	void add(VisibleObject object)
137
	{
138
	{
138
		objects.put(object.getObjectId(), object);
139
		objects.put(object.getObjectId(), object);
140
		if(object instanceof Player)
141
			parent.onPlayerEnter();
139
	}
142
	}
140
143
141
	/**
144
	/**
...
...
146
	void remove(VisibleObject object)
149
	void remove(VisibleObject object)
147
	{
150
	{
148
		objects.remove(object.getObjectId());
151
		objects.remove(object.getObjectId());
152
		if(object instanceof Player)
153
			parent.onPlayerLeave();
149
	}
154
	}
150
}
155
}

Updated trunk/AE-go_GameServer/src/com/aionemu/gameserver/world/World.java Download diff

10051006
30
import com.aionemu.gameserver.model.gameobjects.VisibleObject;
30
import com.aionemu.gameserver.model.gameobjects.VisibleObject;
31
import com.aionemu.gameserver.model.gameobjects.player.Player;
31
import com.aionemu.gameserver.model.gameobjects.player.Player;
32
import com.aionemu.gameserver.model.templates.WorldMapTemplate;
32
import com.aionemu.gameserver.model.templates.WorldMapTemplate;
33
import com.aionemu.gameserver.spawnengine.SpawnEngine;
33
import com.aionemu.gameserver.utils.idfactory.IDFactory;
34
import com.aionemu.gameserver.utils.idfactory.IDFactory;
34
import com.aionemu.gameserver.utils.idfactory.IDFactoryAionObject;
35
import com.aionemu.gameserver.utils.idfactory.IDFactoryAionObject;
35
import com.aionemu.gameserver.world.container.PlayerContainer;
36
import com.aionemu.gameserver.world.container.PlayerContainer;
...
...
69
	private final Map<Integer, WorldMap>	worldMaps	= new HashMap<Integer, WorldMap>();
70
	private final Map<Integer, WorldMap>	worldMaps	= new HashMap<Integer, WorldMap>();
70
71
71
	private IDFactory						aionObjectsIDFactory;
72
	private IDFactory						aionObjectsIDFactory;
73
	@Inject
74
	private SpawnEngine						spawnEngine;
72
75
73
	/**
76
	/**
74
	 * Constructor.
77
	 * Constructor.
...
...
173
	}
176
	}
174
177
175
	/**
178
	/**
179
	 * @return the spawnEngine
180
	 */
181
	public SpawnEngine getSpawnEngine()
182
	{
183
		return spawnEngine;
184
	}
185
186
	/**
176
	 * Return World Map by id
187
	 * Return World Map by id
177
	 * 
188
	 * 
178
	 * @param id
189
	 * @param id
...
...
189
			throw new WorldMapNotExistException("Map: " + id + " not exist!");
200
			throw new WorldMapNotExistException("Map: " + id + " not exist!");
190
		return map;
201
		return map;
191
	}
202
	}
203
	
204
	/**
205
	 * 
206
	 * @param worldId
207
	 * @return
208
	 */
209
	public int getNextAvailableInstanceId(int worldId)
210
	{
211
		WorldMap map = worldMaps.get(worldId);
212
		return map.getNextFreeInstanceIndex();
213
	}
192
214
193
	/**
215
	/**
194
	 * Update position of VisibleObject [used when object is moving on one map instance]. Check if active map region
216
	 * Update position of VisibleObject [used when object is moving on one map instance]. Check if active map region
...
...
256
	 */
278
	 */
257
	public void setPosition(VisibleObject object, int mapId, float x, float y, float z, byte heading)
279
	public void setPosition(VisibleObject object, int mapId, float x, float y, float z, byte heading)
258
	{
280
	{
259
		int instanceIndex = 1;	
281
		int instanceId = 1;	
260
		if(object.getWorldId() == mapId)
282
		if(object.getWorldId() == mapId)
261
		{
283
		{
262
			instanceIndex = object.getInstanceId();
284
			instanceId = object.getInstanceId();
263
		}
285
		}
264
		this.setPosition(object, mapId, instanceIndex, x, y, z, heading);
286
		this.setPosition(object, mapId, instanceId, x, y, z, heading);
265
	}
287
	}
266
	
288
	
267
	/**
289
	/**

Updated trunk/AE-go_GameServer/src/com/aionemu/gameserver/world/WorldMap.java Download diff

10051006
19
import java.util.HashMap;
19
import java.util.HashMap;
20
import java.util.Map;
20
import java.util.Map;
21
21
22
import org.apache.log4j.Logger;
23
22
import com.aionemu.gameserver.model.templates.WorldMapTemplate;
24
import com.aionemu.gameserver.model.templates.WorldMapTemplate;
23
25
24
/**
26
/**
...
...
29
 */
31
 */
30
public class WorldMap
32
public class WorldMap
31
{
33
{
34
	private static Logger log = Logger.getLogger(WorldMap.class);
35
	
32
	private WorldMapTemplate				worldMapTemplate;
36
	private WorldMapTemplate				worldMapTemplate;
33
37
34
	/**
38
	/**
...
...
79
		int twinCount = worldMapTemplate.getTwinCount();
83
		int twinCount = worldMapTemplate.getTwinCount();
80
		return twinCount > 0 ? twinCount : 1;
84
		return twinCount > 0 ? twinCount : 1;
81
	}
85
	}
86
	
87
	/**
88
	 *  Will create new instance if there are not free yet and spawn according to xml data
89
	 *  //TODO limit
90
	 *  //TODO dispose unused instances (lifecycle)
91
	 * @return
92
	 */
93
	public synchronized int getNextFreeInstanceIndex()
94
	{	
95
		for(WorldMapInstance instance : instances.values())
96
		{
97
			if(!instance.isInUse())
98
				return instance.getInstanceId();
99
		}
100
		//create new instance
101
		int nextInstanceId = instances.size() + 1;
102
		log.info("Creating new instance: " + worldMapTemplate.getMapId() + " " + nextInstanceId );
103
		instances.put(nextInstanceId, new WorldMapInstance(this, nextInstanceId));
104
		world.getSpawnEngine().spawnInstance(worldMapTemplate.getMapId(), nextInstanceId);
105
		
106
		return nextInstanceId;
107
	}
82
108
83
	/**
109
	/**
84
	 * Return a WorldMapInstance - depends on map configuration one map may have twins instances to balance player. This
110
	 * Return a WorldMapInstance - depends on map configuration one map may have twins instances to balance player. This
...
...
126
		}
152
		}
127
		return getWorldMapInstance(instanceId);
153
		return getWorldMapInstance(instanceId);
128
	}
154
	}
129
	
130
	/**
131
	 * 
132
	 * @return
133
	 */
134
	public WorldMapInstance getNextFreeInstance()
135
	{
136
		//TODO
137
		if(worldMapTemplate.getTwinCount() !=0)
138
		{
139
			for(WorldMapInstance instance : instances.values())
140
			{
141
				if(instance.getCurrentPlayerCount() == 0)
142
					return instance;
143
			}
144
		}
145
		return null;
146
	}
147
155
148
	/**
156
	/**
149
	 * Returns WorldMapInstance by instanceId.
157
	 * Returns WorldMapInstance by instanceId.

Updated trunk/AE-go_GameServer/src/com/aionemu/gameserver/world/WorldMapInstance.java Download diff

10051006
191
	{
191
	{
192
		currentPlayerCount--;
192
		currentPlayerCount--;
193
	}
193
	}
194
	
195
	public boolean isInUse()
196
	{
197
		return currentPlayerCount > 0;
198
	}
194
199
195
	/**
200
	/**
196
	 * @return the instanceIndex
201
	 * @return the instanceIndex