Changeset 1514

User picture

Author: ATracer

(2010/03/14 12:30) Almost 2 years ago

Instances refactoring. Players should be able to rejoin group instance. Relog should place player in the same instance or move to instance's entry point (same for ascension quest). Added Fire Temple instance support (Morheim entry only)

Affected files

Updated trunk/AE-go_GameServer/config/main/periodicsave.properties Download diff

15131514
19
# ----------------------------
19
# ----------------------------
20
#
20
#
21
# WARNING:
21
# WARNING:
22
# Saving of player data for one player could upto 1sec
22
# With 500 player online saving can be upto 10 seconds
23
# with 500 player online it can be upto 10 minutes
23
# (it depends on hardware, changes in item locations, new acquisitions etc)
24
# (it depends on changes in item locations, new acquisitions etc)
25
# Generally accepted inteval is 15-20 minutes
24
# Generally accepted inteval is 15-20 minutes
26
25
27
# Time in seconds for saving player data (player, abyss rank, quests, skills)
26
# Time in seconds for saving player data (player, abyss rank, quests, skills)

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

15131514
39
import com.aionemu.gameserver.questEngine.model.QuestEnv;
39
import com.aionemu.gameserver.questEngine.model.QuestEnv;
40
import com.aionemu.gameserver.questEngine.model.QuestState;
40
import com.aionemu.gameserver.questEngine.model.QuestState;
41
import com.aionemu.gameserver.questEngine.model.QuestStatus;
41
import com.aionemu.gameserver.questEngine.model.QuestStatus;
42
import com.aionemu.gameserver.services.InstanceService;
42
import com.aionemu.gameserver.services.ItemService;
43
import com.aionemu.gameserver.services.ItemService;
43
import com.aionemu.gameserver.services.TeleportService;
44
import com.aionemu.gameserver.services.TeleportService;
44
import com.aionemu.gameserver.services.ZoneService;
45
import com.aionemu.gameserver.services.ZoneService;
...
...
65
	@Inject
66
	@Inject
66
	TeleportService teleportService;
67
	TeleportService teleportService;
67
	@Inject
68
	@Inject
69
	InstanceService instanceService;
70
	@Inject
68
	World world;
71
	World world;
69
	
72
	
70
	public _1006Ascension()
73
	public _1006Ascension()
...
...
171
							qs.setQuestVar(99);
174
							qs.setQuestVar(99);
172
							updateQuestStatus(player, qs);
175
							updateQuestStatus(player, qs);
173
							PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(env.getVisibleObject().getObjectId(), 0));
176
							PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(env.getVisibleObject().getObjectId(), 0));
174
							WorldMapInstance newInstance = player.getPosition().getWorld().getNextAvailableInstance(310010000);
177
							WorldMapInstance newInstance = instanceService.getNextAvailableInstance(310010000, 60 * 20);
175
							newInstance.setDestroyTime(60 * 20);
178
							instanceService.registerPlayerWithInstance(newInstance, player);
176
							teleportService.teleportTo(player, 310010000, newInstance.getInstanceId(), 52, 174, 229, 0);
179
							teleportService.teleportTo(player, 310010000, newInstance.getInstanceId(), 52, 174, 229, 0);
177
							return true;
180
							return true;
178
						}
181
						}
...
...
411
			int var = qs.getQuestVars().getQuestVars();
414
			int var = qs.getQuestVars().getQuestVars();
412
			if(var == 4 || (var >= 50 && var <= 55) || var == 99)
415
			if(var == 4 || (var >= 50 && var <= 55) || var == 99)
413
			{
416
			{
414
				int instanceId = player.getInstanceId();
417
				if(player.getWorldId() != 310010000)
415
				WorldMap worldMap = world.getWorldMap(310010000);
416
				int id = -1;
417
				if (worldMap != null)
418
					id = worldMap.getWorldMapScriptInstanceIdByPlyerObjId(player.getObjectId());
419
				if(id == -1 || player.getWorldId() != 310010000)
420
				{
418
				{
421
					qs.setQuestVar(3);
419
					qs.setQuestVar(3);
422
					updateQuestStatus(player, qs);
420
					updateQuestStatus(player, qs);
423
					PacketSendUtility.sendPacket(player, new SM_SYSTEM_MESSAGE(SystemMessageId.QUEST_FAILED_$1, DataManager.QUEST_DATA.getQuestById(questId).getName()));
421
					PacketSendUtility.sendPacket(player, new SM_SYSTEM_MESSAGE(SystemMessageId.QUEST_FAILED_$1, DataManager.QUEST_DATA.getQuestById(questId).getName()));
424
					teleportService.teleportTo(player, 210010000, 1, 244f, 1639f, 100.5f, 1000);
425
				}
422
				}
426
				else if(id != instanceId)
427
					teleportService.changeChannel(player, id-1);
428
			}
423
			}
429
		}
424
		}
430
		return false;
425
		return false;

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

15131514
37
import com.aionemu.gameserver.questEngine.model.QuestEnv;
37
import com.aionemu.gameserver.questEngine.model.QuestEnv;
38
import com.aionemu.gameserver.questEngine.model.QuestState;
38
import com.aionemu.gameserver.questEngine.model.QuestState;
39
import com.aionemu.gameserver.questEngine.model.QuestStatus;
39
import com.aionemu.gameserver.questEngine.model.QuestStatus;
40
import com.aionemu.gameserver.services.InstanceService;
40
import com.aionemu.gameserver.services.ItemService;
41
import com.aionemu.gameserver.services.ItemService;
41
import com.aionemu.gameserver.services.TeleportService;
42
import com.aionemu.gameserver.services.TeleportService;
42
import com.aionemu.gameserver.utils.PacketSendUtility;
43
import com.aionemu.gameserver.utils.PacketSendUtility;
...
...
59
	TeleportService	teleportService;
60
	TeleportService	teleportService;
60
	@Inject
61
	@Inject
61
	ItemService itemService;
62
	ItemService itemService;
63
	@Inject
64
	InstanceService instanceService;
62
65
63
	public _2008Ascension()
66
	public _2008Ascension()
64
	{
67
	{
...
...
192
							updateQuestStatus(player, qs);
195
							updateQuestStatus(player, qs);
193
							PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(env.getVisibleObject().getObjectId(), 0));
196
							PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(env.getVisibleObject().getObjectId(), 0));
194
							// Create instance
197
							// Create instance
195
							WorldMapInstance newInstance = player.getPosition().getWorld().getNextAvailableInstance(320010000);
198
							WorldMapInstance newInstance = instanceService.getNextAvailableInstance(320010000, 60 * 20);
196
							newInstance.setDestroyTime(60 * 20); // 20 min
199
							instanceService.registerPlayerWithInstance(newInstance, player);
197
							teleportService.teleportTo(player, 320010000, newInstance.getInstanceId(), 457.65f, 426.8f, 230.4f, 0);
200
							teleportService.teleportTo(player, 320010000, newInstance.getInstanceId(), 457.65f, 426.8f, 230.4f, 0);
198
							return true;
201
							return true;
199
						}
202
						}
...
...
365
	public boolean onEnterWorldEvent(QuestEnv env)
368
	public boolean onEnterWorldEvent(QuestEnv env)
366
	{
369
	{
367
		Player player = env.getPlayer();
370
		Player player = env.getPlayer();
368
		int instanceId = player.getInstanceId();
369
		QuestState qs = player.getQuestStateList().getQuestState(questId);
371
		QuestState qs = player.getQuestStateList().getQuestState(questId);
370
		if(qs != null && qs.getStatus() == QuestStatus.START)
372
		if(qs != null && qs.getStatus() == QuestStatus.START)
371
		{
373
		{
372
			int var = qs.getQuestVars().getQuestVars();
374
			int var = qs.getQuestVars().getQuestVars();
373
			if(var == 5 || (var >= 50 && var <= 55) || var == 99)
375
			if(var == 5 || (var >= 50 && var <= 55) || var == 99)
374
			{
376
			{
375
				WorldMap worldMap = world.getWorldMap(320010000);
377
				if(player.getWorldId() != 320010000)
376
				int id = -1;
377
				if (worldMap != null)
378
					id = worldMap.getWorldMapScriptInstanceIdByPlyerObjId(player.getObjectId());
379
				if(id == -1 || player.getWorldId() != 320010000)
380
				{
378
				{
381
					qs.setQuestVar(4);
379
					qs.setQuestVar(4);
382
					updateQuestStatus(player, qs);
380
					updateQuestStatus(player, qs);
383
					PacketSendUtility.sendPacket(player, new SM_SYSTEM_MESSAGE(SystemMessageId.QUEST_FAILED_$1, DataManager.QUEST_DATA.getQuestById(questId).getName()));
381
					PacketSendUtility.sendPacket(player, new SM_SYSTEM_MESSAGE(SystemMessageId.QUEST_FAILED_$1, DataManager.QUEST_DATA.getQuestById(questId).getName()));
384
					teleportService.teleportTo(player, 220010000, 1, 378.9f, 1895.39f, 330.0f, 1000);
385
				}
382
				}
386
				else if(id != instanceId)
387
					teleportService.changeChannel(player, id-1);
388
			}
383
			}
389
		}
384
		}
390
		return false;
385
		return false;

Updated trunk/AE-go_GameServer/data/scripts/system/handlers/quest/poeta/_1002RequestoftheElim.java Download diff

15131514
31
import com.aionemu.gameserver.questEngine.model.QuestEnv;
31
import com.aionemu.gameserver.questEngine.model.QuestEnv;
32
import com.aionemu.gameserver.questEngine.model.QuestState;
32
import com.aionemu.gameserver.questEngine.model.QuestState;
33
import com.aionemu.gameserver.questEngine.model.QuestStatus;
33
import com.aionemu.gameserver.questEngine.model.QuestStatus;
34
import com.aionemu.gameserver.services.InstanceService;
34
import com.aionemu.gameserver.services.ItemService;
35
import com.aionemu.gameserver.services.ItemService;
35
import com.aionemu.gameserver.services.TeleportService;
36
import com.aionemu.gameserver.services.TeleportService;
36
import com.aionemu.gameserver.utils.PacketSendUtility;
37
import com.aionemu.gameserver.utils.PacketSendUtility;
...
...
45
public class _1002RequestoftheElim extends QuestHandler
46
public class _1002RequestoftheElim extends QuestHandler
46
{
47
{
47
	@Inject
48
	@Inject
49
	InstanceService instanceService;
50
	@Inject
48
	TeleportService teleportService;
51
	TeleportService teleportService;
49
	@Inject
52
	@Inject
50
	ItemService itemService;
53
	ItemService itemService;
...
...
271
						updateQuestStatus(player, qs);
274
						updateQuestStatus(player, qs);
272
						PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(env.getVisibleObject().getObjectId(),
275
						PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(env.getVisibleObject().getObjectId(),
273
							0));
276
							0));
274
						WorldMapInstance newInstance = player.getPosition().getWorld().getNextAvailableInstance(310010000);
277
						WorldMapInstance newInstance = instanceService.getNextAvailableInstance(310010000, 60 * 5);
275
						newInstance.setDestroyTime(60 * 5);
276
						teleportService.teleportTo(player, 310010000, newInstance.getInstanceId(), 52, 174, 229, 0);
278
						teleportService.teleportTo(player, 310010000, newInstance.getInstanceId(), 52, 174, 229, 0);
277
						return true;
279
						return true;
278
					}
280
					}

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

15131514
1
<portal_templates>
1
<?xml version="1.0" encoding="UTF-8"?>
2
	<portal npcid="700414" mapid="300030000" x="600" y="700" z="327.165" instance="true" minlevel="25" maxlevel="28" group="true"/>
2
<portal_templates xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3
	xsi:noNamespaceSchemaLocation="portal_template.xsd">
4
5
	<!-- Nochsana Training Camp -->
6
	<portal npcid="700414"  instance="true" minlevel="25" maxlevel="28" group="true" race="ASMODIANS">
7
		<entrypoint mapid="400010000" x="876.7211" y="3079.2874" z="1644.5786"/>
8
		<exitpoint mapid="300030000" x="600" y="700" z="327.165"/>
9
	</portal>
10
	
11
	<!-- Fire Temple -->
12
	<portal npcid="730047" instance="true" minlevel="25" maxlevel="50" group="true">
13
		<entrypoint mapid="220020000" x="1592.178" y="977.2572" z="140.75"/>
14
		<exitpoint mapid="320100000" x="148.256" y="460.857" z="141.713"/>
15
	</portal>
16
	
17
	<!-- Pernos [Ascension quest]-->
18
	<portal npcid="790001" instance="true">
19
		<entrypoint mapid="210010000" x="241.094" y="1639.461" z="100.38"/>
20
		<exitpoint mapid="310010000" x="52" y="174" z="229"/>
21
	</portal>
22
	
23
	<!-- Munin [Ascension quest]-->
24
	<portal npcid="203550" instance="true">
25
		<entrypoint mapid="220010000" x="378.9" y="1895.39" z="330.0"/>
26
		<exitpoint mapid="310010000" x="52" y="174" z="229"/>
27
	</portal>
28
	
3
</portal_templates>
29
</portal_templates>

Updated trunk/AE-go_GameServer/data/static_data/portals/portal_templates.xsd Download diff

15131514
2
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
2
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
3
3
4
	<xs:include schemaLocation="../import.xsd" />
4
	<xs:include schemaLocation="../import.xsd" />
5
	<xs:include schemaLocation="../global_types.xsd" />
5
6
6
	<xs:element name="portal_templates">
7
	<xs:element name="portal_templates">
7
		<xs:complexType>
8
		<xs:complexType>
...
...
14
	</xs:element>
15
	</xs:element>
15
16
16
	<xs:complexType name="Portal">
17
	<xs:complexType name="Portal">
18
		<xs:sequence>
19
			<xs:element name="entrypoint" type="EntryPoint" minOccurs="1" maxOccurs="1"/>
20
			<xs:element name="exitpoint" type="ExitPoint" minOccurs="1" maxOccurs="1"/>
21
		</xs:sequence>
22
		<xs:attribute name="race" type="Race" />
17
		<xs:attribute name="group" type="xs:boolean" />
23
		<xs:attribute name="group" type="xs:boolean" />
18
		<xs:attribute name="maxlevel" type="xs:int" />
24
		<xs:attribute name="maxlevel" type="xs:int" />
19
		<xs:attribute name="minlevel" type="xs:int" />
25
		<xs:attribute name="minlevel" type="xs:int" />
20
		<xs:attribute name="instance" type="xs:boolean" />
26
		<xs:attribute name="instance" type="xs:boolean" />	
27
		<xs:attribute name="npcid" type="xs:int" />
28
	</xs:complexType>
29
30
	<xs:complexType name="EntryPoint">
31
		<xs:attribute name="mapid" type="xs:int" />
32
		<xs:attribute name="x" type="xs:float" />
33
		<xs:attribute name="y" type="xs:float" />
21
		<xs:attribute name="z" type="xs:float" />
34
		<xs:attribute name="z" type="xs:float" />
35
	</xs:complexType>
36
37
	<xs:complexType name="ExitPoint">
38
		<xs:attribute name="mapid" type="xs:int" />
39
		<xs:attribute name="x" type="xs:float" />
22
		<xs:attribute name="y" type="xs:float" />
40
		<xs:attribute name="y" type="xs:float" />
23
		<xs:attribute name="x" type="xs:float" />
41
		<xs:attribute name="z" type="xs:float" />
24
		<xs:attribute name="mapid" type="xs:int" />
25
		<xs:attribute name="npcid" type="xs:int" />
26
	</xs:complexType>
42
	</xs:complexType>
27
</xs:schema>
43
</xs:schema>
28
44

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

15131514
24
import com.aionemu.gameserver.model.gameobjects.Creature;
24
import com.aionemu.gameserver.model.gameobjects.Creature;
25
import com.aionemu.gameserver.model.gameobjects.player.Player;
25
import com.aionemu.gameserver.model.gameobjects.player.Player;
26
import com.aionemu.gameserver.model.group.PlayerGroup;
26
import com.aionemu.gameserver.model.group.PlayerGroup;
27
import com.aionemu.gameserver.model.templates.portal.ExitPoint;
27
import com.aionemu.gameserver.model.templates.portal.PortalTemplate;
28
import com.aionemu.gameserver.model.templates.portal.PortalTemplate;
28
import com.aionemu.gameserver.network.aion.serverpackets.SM_EMOTION;
29
import com.aionemu.gameserver.network.aion.serverpackets.SM_EMOTION;
29
import com.aionemu.gameserver.network.aion.serverpackets.SM_USE_OBJECT;
30
import com.aionemu.gameserver.network.aion.serverpackets.SM_USE_OBJECT;
31
import com.aionemu.gameserver.services.InstanceService;
30
import com.aionemu.gameserver.utils.PacketSendUtility;
32
import com.aionemu.gameserver.utils.PacketSendUtility;
31
import com.aionemu.gameserver.utils.ThreadPoolManager;
33
import com.aionemu.gameserver.utils.ThreadPoolManager;
32
import com.aionemu.gameserver.world.WorldMapInstance;
34
import com.aionemu.gameserver.world.WorldMapInstance;
...
...
34
36
35
/**
37
/**
36
 * @author ATracer
38
 * @author ATracer
37
 *
39
 * 
38
 */
40
 */
39
public class PortalController extends NpcController
41
public class PortalController extends NpcController
40
{
42
{
41
	@Inject
43
	@Inject
42
	private PortalData portalData;
44
	private PortalData		portalData;
43
	
45
	@Inject
44
	private PortalTemplate portalTemplate;
46
	private InstanceService	instanceService;
45
	
47
48
	private PortalTemplate	portalTemplate;
49
46
	@Override
50
	@Override
47
	public void setOwner(Creature owner)
51
	public void setOwner(Creature owner)
48
	{
52
	{
...
...
50
		portalTemplate = portalData.getPortalTemplate(owner.getObjectTemplate().getTemplateId());
54
		portalTemplate = portalData.getPortalTemplate(owner.getObjectTemplate().getTemplateId());
51
	}
55
	}
52
56
53
54
55
	@Override
57
	@Override
56
	public void onDialogRequest(Player player)
58
	public void onDialogRequest(final Player player)
57
	{
59
	{
58
		if(portalTemplate == null)
60
		if(portalTemplate == null)
59
			return;
61
			return;
60
		
61
		if(portalTemplate.isInstance() && CustomConfig.ENABLE_INSTANCES)
62
			portGroup(player);
63
		else
64
			port(player);
65
	}
66
62
63
		if(!CustomConfig.ENABLE_INSTANCES)
64
			return;
67
65
66
		final int defaultUseTime = 3000;
67
		PacketSendUtility.sendPacket(player, new SM_USE_OBJECT(player.getObjectId(), getOwner().getObjectId(),
68
			defaultUseTime, 1));
69
		PacketSendUtility.broadcastPacket(player, new SM_EMOTION(player, 37, 0, getOwner().getObjectId()), true);
68
70
71
		ThreadPoolManager.getInstance().schedule(new Runnable(){
72
			@Override
73
			public void run()
74
			{
75
				PacketSendUtility.sendPacket(player, new SM_USE_OBJECT(player.getObjectId(), getOwner().getObjectId(),
76
					defaultUseTime, 0));
77
				
78
				analyzePortation(player);
79
			}
80
			
81
			/**
82
			 * @param player
83
			 */
84
			private void analyzePortation(final Player player)
85
			{
86
				PlayerGroup group = player.getPlayerGroup();
87
88
				if(portalTemplate.isGroup() && group != null)
89
				{
90
					WorldMapInstance instance = instanceService.getRegisteredInstance(portalTemplate.getExitPoint()
91
						.getMapId(), group.getGroupId());
92
					// if already registered - just teleport
93
					if(instance != null)
94
					{
95
						transfer(player, instance);
96
						return;
97
					}
98
99
					portGroup(player);
100
				}
101
				else if(!portalTemplate.isGroup())
102
				{
103
					WorldMapInstance instance = instanceService.getRegisteredInstance(portalTemplate.getExitPoint()
104
						.getMapId(), player.getObjectId());
105
					// if already registered - just teleport
106
					if(instance != null)
107
					{
108
						transfer(player, instance);
109
						return;
110
					}
111
					port(player);
112
				}
113
			}
114
		}, defaultUseTime);
115
116
	}
117
69
	/**
118
	/**
70
	 * @param player
119
	 * @param player
71
	 */
120
	 */
72
	private void port(Player player)
121
	private void port(Player requester)
73
	{
122
	{
74
		Collection<Player> players = Collections.singletonList(player);
123
		Collection<Player> players = Collections.singletonList(requester);
75
		if(!checkPlayersLevel(players))
124
		if(!checkPlayersLevel(players))
76
			return;
125
			return;
77
		
126
78
		transfer(player, players);
127
		WorldMapInstance instance = instanceService.getNextAvailableInstance(portalTemplate.getExitPoint().getMapId());
128
		instanceService.registerPlayerWithInstance(instance, requester);
129
		transfer(requester, instance);
79
	}
130
	}
80
131
81
82
	/**
132
	/**
83
	 * @param player
133
	 * @param player
84
	 */
134
	 */
85
	private void portGroup(Player player)
135
	private void portGroup(Player requester)
86
	{
136
	{
87
		PlayerGroup group = player.getPlayerGroup();
137
		PlayerGroup group = requester.getPlayerGroup();
88
		if(group == null || group.getGroupLeader().getObjectId() != player.getObjectId())
138
		if(group == null || group.getGroupLeader().getObjectId() != requester.getObjectId())
139
		{
140
			PacketSendUtility.sendMessage(requester, "You are not group leader");
89
			return;
141
			return;
90
		
142
		}		
143
91
		Collection<Player> players = group.getMembers();
144
		Collection<Player> players = group.getMembers();
92
		if(!checkPlayersLevel(players))
145
		if(!checkPlayersLevel(players))
93
			return;
146
			return;
94
		
147
95
		transfer(player, players);		
148
		WorldMapInstance instance = instanceService.getNextAvailableInstance(portalTemplate.getExitPoint().getMapId());
149
		instanceService.registerGroupWithInstance(instance, group);
150
		for(Player player : players)
151
		{
152
			transfer(player, instance);
153
		}
96
	}
154
	}
97
155
98
	/**
156
	/**
99
	 * @param players
157
	 * @param players
100
	 */
158
	 */
101
	private void transfer(final Player leader, final Collection<Player> players)
159
	private void transfer(Player player, WorldMapInstance instance)
102
	{
160
	{
103
		final int defaultUseTime = 3000;
161
		ExitPoint exitPoint = portalTemplate.getExitPoint();
104
		PacketSendUtility.sendPacket(leader, new SM_USE_OBJECT(leader.getObjectId(), 
162
		sp.getTeleportService().teleportTo(player, exitPoint.getMapId(), instance.getInstanceId(),
105
			getOwner().getObjectId(), defaultUseTime, 1));
163
			exitPoint.getX(), exitPoint.getY(), exitPoint.getZ(), 0);
106
		PacketSendUtility.broadcastPacket(leader, new SM_EMOTION(leader, 37, 0, getOwner().getObjectId()), true);
107
		
108
		ThreadPoolManager.getInstance().schedule(new Runnable(){
109
			@Override
110
			public void run()
111
			{
112
				PacketSendUtility.sendPacket(leader, new SM_USE_OBJECT(leader.getObjectId(), 
113
					getOwner().getObjectId(), defaultUseTime, 0));
114
				
115
				WorldMapInstance newInstance = sp.getWorld().getNextAvailableInstance(portalTemplate.getMapId());
116
				newInstance.setDestroyTime(60 * 30);
117
				
118
				for(Player player : players)
119
				{
120
					sp.getTeleportService().teleportTo(player, portalTemplate.getMapId(), newInstance.getInstanceId(),
121
						portalTemplate.getX(), portalTemplate.getY(), portalTemplate.getZ(), 0);
122
				}
123
			}
124
		}, defaultUseTime);
125
	}
164
	}
126
165
127
	
128
	/**
166
	/**
129
	 * 
167
	 * 
130
	 * @param players
168
	 * @param players
...
...
134
	{
172
	{
135
		int minLevel = portalTemplate.getMinLevel();
173
		int minLevel = portalTemplate.getMinLevel();
136
		int maxLevel = portalTemplate.getMaxLevel();
174
		int maxLevel = portalTemplate.getMaxLevel();
137
		
175
138
		for(Player player : players)
176
		for(Player player : players)
139
		{
177
		{
140
			int playerLevel = player.getLevel();
178
			int playerLevel = player.getLevel();
...
...
143
		}
181
		}
144
		return true;
182
		return true;
145
	}
183
	}
146
	
184
147
	
148
}
185
}

Updated trunk/AE-go_GameServer/src/com/aionemu/gameserver/dataholders/PortalData.java Download diff

15131514
41
	
41
	
42
	/** A map containing all npc templates */
42
	/** A map containing all npc templates */
43
	private TIntObjectHashMap<PortalTemplate> portalData	= new TIntObjectHashMap<PortalTemplate>();
43
	private TIntObjectHashMap<PortalTemplate> portalData	= new TIntObjectHashMap<PortalTemplate>();
44
	private TIntObjectHashMap<PortalTemplate> worldIdPortalMap	= new TIntObjectHashMap<PortalTemplate>();
44
	
45
	
45
	void afterUnmarshal(Unmarshaller u, Object parent)
46
	void afterUnmarshal(Unmarshaller u, Object parent)
46
	{
47
	{
47
		for(PortalTemplate portal : portals)
48
		for(PortalTemplate portal : portals)
48
		{
49
		{
49
			portalData.put(portal.getNpcId(), portal);
50
			portalData.put(portal.getNpcId(), portal);
51
			worldIdPortalMap.put(portal.getExitPoint().getMapId(), portal);
50
		}
52
		}
51
		portals = null;
53
		portals = null;
52
	}
54
	}
...
...
56
		return portalData.size();
58
		return portalData.size();
57
	}
59
	}
58
	
60
	
59
	public PortalTemplate getPortalTemplate(int id)
61
	/**
62
	 * 
63
	 * @param npcId
64
	 * @return
65
	 */
66
	public PortalTemplate getPortalTemplate(int npcId)
60
	{
67
	{
61
		return portalData.get(id);
68
		return portalData.get(npcId);
62
	}
69
	}
70
	
71
	/**
72
	 * 
73
	 * @param worldId
74
	 * @return
75
	 */
76
	public PortalTemplate getPortalTemplateByMap(int worldId)
77
	{
78
		return worldIdPortalMap.get(worldId);
79
	}
80
	
81
	
63
}
82
}

Updated trunk/AE-go_GameServer/src/com/aionemu/gameserver/dataholders/WorldMapsData.java Download diff

15131514
16
 */
16
 */
17
package com.aionemu.gameserver.dataholders;
17
package com.aionemu.gameserver.dataholders;
18
18
19
import gnu.trove.TIntObjectHashMap;
20
19
import java.util.Iterator;
21
import java.util.Iterator;
20
import java.util.List;
22
import java.util.List;
21
23
24
import javax.xml.bind.Unmarshaller;
22
import javax.xml.bind.annotation.XmlAccessType;
25
import javax.xml.bind.annotation.XmlAccessType;
23
import javax.xml.bind.annotation.XmlAccessorType;
26
import javax.xml.bind.annotation.XmlAccessorType;
24
import javax.xml.bind.annotation.XmlElement;
27
import javax.xml.bind.annotation.XmlElement;
...
...
40
{
43
{
41
	@XmlElement(name = "map")
44
	@XmlElement(name = "map")
42
	private List<WorldMapTemplate>	worldMaps;
45
	private List<WorldMapTemplate>	worldMaps;
46
	
47
	private TIntObjectHashMap<WorldMapTemplate>	worldIdMap	= new TIntObjectHashMap<WorldMapTemplate>();
48
	
49
	void afterUnmarshal(Unmarshaller u, Object parent)
50
	{
51
		for(WorldMapTemplate map : worldMaps)
52
		{
53
			worldIdMap.put(map.getMapId(), map);
54
		}
55
	}
43
56
44
	/**
57
	/**
45
	 * {@inheritDoc}
58
	 * {@inheritDoc}
...
...
59
	{
72
	{
60
		return worldMaps == null ? 0 : worldMaps.size();
73
		return worldMaps == null ? 0 : worldMaps.size();
61
	}
74
	}
75
	
76
	/**
77
	 * 
78
	 * @param worldId
79
	 * @return
80
	 */
81
	public WorldMapTemplate getTemplate(int worldId)
82
	{
83
		return worldIdMap.get(worldId);
84
	}
62
}
85
}

Added trunk/AE-go_GameServer/src/com/aionemu/gameserver/model/templates/portal/EntryPoint.java

Show contents

Added trunk/AE-go_GameServer/src/com/aionemu/gameserver/model/templates/portal/ExitPoint.java

Show contents

Updated trunk/AE-go_GameServer/src/com/aionemu/gameserver/model/templates/portal/PortalTemplate.java Download diff

15131514
19
import javax.xml.bind.annotation.XmlAccessType;
19
import javax.xml.bind.annotation.XmlAccessType;
20
import javax.xml.bind.annotation.XmlAccessorType;
20
import javax.xml.bind.annotation.XmlAccessorType;
21
import javax.xml.bind.annotation.XmlAttribute;
21
import javax.xml.bind.annotation.XmlAttribute;
22
import javax.xml.bind.annotation.XmlElement;
22
import javax.xml.bind.annotation.XmlType;
23
import javax.xml.bind.annotation.XmlType;
23
24
25
import com.aionemu.gameserver.model.Race;
26
24
/**
27
/**
25
 * @author ATracer
28
 * @author ATracer
26
 * 
29
 * 
...
...
31
{
34
{
32
	@XmlAttribute(name = "npcid")
35
	@XmlAttribute(name = "npcid")
33
	protected int	npcId;
36
	protected int	npcId;
34
	@XmlAttribute(name = "mapid")
35
	protected int	mapId;
36
	@XmlAttribute(name = "x")
37
	protected float	x;
38
	@XmlAttribute(name = "y")
39
	protected float	y;
40
	@XmlAttribute(name = "z")
41
	protected float	z;
42
	@XmlAttribute(name = "instance")
37
	@XmlAttribute(name = "instance")
43
	protected boolean	instance;
38
	protected boolean	instance;
44
	@XmlAttribute(name = "minlevel")
39
	@XmlAttribute(name = "minlevel")
45
	protected int	minLevel;
40
	protected int	minLevel;
46
	@XmlAttribute(name = "maxlevel")
41
	@XmlAttribute(name = "maxlevel")
47
	protected int	maxLevel;
42
	protected int	maxLevel;
48
	@XmlAttribute(name = "item_id")
43
	@XmlAttribute(name = "group")
49
	protected boolean	group;
44
	protected boolean	group;
45
	@XmlAttribute(name = "race")
46
	protected Race race;
47
	@XmlElement(name = "entrypoint")
48
	protected EntryPoint	entryPoint;
49
	@XmlElement(name = "exitpoint")
50
	protected ExitPoint	exitPoint;
50
	/**
51
	/**
51
	 * @return the npcId
52
	 * @return the npcId
52
	 */
53
	 */
...
...
55
		return npcId;
56
		return npcId;
56
	}
57
	}
57
	/**
58
	/**
58
	 * @return the mapId
59
	 */
60
	public int getMapId()
61
	{
62
		return mapId;
63
	}
64
	/**
65
	 * @return the x
66
	 */
67
	public float getX()
68
	{
69
		return x;
70
	}
71
	/**
72
	 * @return the y
73
	 */
74
	public float getY()
75
	{
76
		return y;
77
	}
78
	/**
79
	 * @return the z
80
	 */
81
	public float getZ()
82
	{
83
		return z;
84
	}
85
	/**
86
	 * @return the instance
59
	 * @return the instance
87
	 */
60
	 */
88
	public boolean isInstance()
61
	public boolean isInstance()
...
...
110
	{
83
	{
111
		return group;
84
		return group;
112
	}
85
	}
86
	/**
87
	 * @return the race
88
	 */
89
	public Race getRace()
90
	{
91
		return race;
92
	}
93
	/**
94
	 * @return the entryPoint
95
	 */
96
	public EntryPoint getEntryPoint()
97
	{
98
		return entryPoint;
99
	}
100
	/**
101
	 * @return the exitPoint
102
	 */
103
	public ExitPoint getExitPoint()
104
	{
105
		return exitPoint;
106
	}
113
}
107
}

Updated trunk/AE-go_GameServer/src/com/aionemu/gameserver/network/aion/clientpackets/CM_ENTER_WORLD.java Download diff

15131514
124
		if(player != null && client.setActivePlayer(player))
124
		if(player != null && client.setActivePlayer(player))
125
		{
125
		{
126
			player.setClientConnection(client);
126
			player.setClientConnection(client);
127
			player.getController().startProtectionActiveTask();
128
			/*
127
			/*
129
			 * Store player into World.
128
			 * Store player into World.
130
			 */
129
			 */
...
...
188
			}
187
			}
189
188
190
			client.sendPacket(new SM_INVENTORY_INFO());
189
			client.sendPacket(new SM_INVENTORY_INFO());
191
			client.sendPacket(new SM_CHANNEL_INFO(player.getPosition())); // ?? unknwon
190
191
			playerService.playerLoggedIn(player);
192
192
			// sendPacket(new SM_UNKD3());
193
			// sendPacket(new SM_UNKD3());
193
194
194
			/*
195
			/*
195
			 * Needed
196
			 * Needed
196
			 */
197
			 */
198
			
197
			client.sendPacket(new SM_STATS_INFO(player));
199
			client.sendPacket(new SM_STATS_INFO(player));
198
			sendPacket(new SM_CUBE_UPDATE(player, 6));
200
			sendPacket(new SM_CUBE_UPDATE(player, 6));
199
201
...
...
206
			player.getController().updateNearbyQuests();
208
			player.getController().updateNearbyQuests();
207
209
208
			sendPacket(new SM_TITLE_LIST(player));
210
			sendPacket(new SM_TITLE_LIST(player));
209
211
			
212
			client.sendPacket(new SM_CHANNEL_INFO(player.getPosition()));
210
			/**
213
			/**
211
			 * Player's accumulated time; params are: - 0h 12m - play time (1st and 2nd string-params) - 1h 26m - rest
214
			 * Player's accumulated time; params are: - 0h 12m - play time (1st and 2nd string-params) - 1h 26m - rest
212
			 * time (3rd and 4th string-params)
215
			 * time (3rd and 4th string-params)
...
...
237
			if(player.isLegionMember())
240
			if(player.isLegionMember())
238
				legionService.legionMemberOnLogin(player);
241
				legionService.legionMemberOnLogin(player);
239
242
240
			playerService.playerLoggedIn(player);
241
242
			if(player.isInGroup())
243
			if(player.isInGroup())
243
				groupService.groupMemberOnLogin(player);
244
				groupService.groupMemberOnLogin(player);
244
245

Added trunk/AE-go_GameServer/src/com/aionemu/gameserver/services/InstanceService.java

Show contents

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

15131514
91
	private ItemService					itemService;
91
	private ItemService					itemService;
92
	private LegionService				legionService;
92
	private LegionService				legionService;
93
	private TeleportService				teleportService;
93
	private TeleportService				teleportService;
94
	private PlayerControllerFactory			controllerFactory;
94
	private PlayerControllerFactory		controllerFactory;
95
	private SkillLearnService			skillLearnService;
95
	private SkillLearnService			skillLearnService;
96
	private GroupService				groupService;
96
	private GroupService				groupService;
97
	private PunishmentService			punishmentService;
97
	private PunishmentService			punishmentService;
98
	private DuelService					duelService;
98
	private DuelService					duelService;
99
	private PlayerStatsData				playerStatsData;
99
	private PlayerStatsData				playerStatsData;
100
	private PlayerInitialData			playerInitialData;
100
	private PlayerInitialData			playerInitialData;
101
	private InstanceService				instanceService;
101
102
102
	@Inject
103
	@Inject
103
	public PlayerService(World world, ItemService itemService,
104
	public PlayerService(World world, ItemService itemService,
104
		LegionService legionService, TeleportService teleportService, PlayerControllerFactory controllerFactory,
105
		LegionService legionService, TeleportService teleportService, PlayerControllerFactory controllerFactory,
105
		SkillLearnService skillLearnService, GroupService groupService, PunishmentService punishmentService,
106
		SkillLearnService skillLearnService, GroupService groupService, PunishmentService punishmentService,
106
		DuelService duelService, PlayerStatsData playerStatsData, PlayerInitialData playerInitialData)
107
		DuelService duelService, PlayerStatsData playerStatsData, PlayerInitialData playerInitialData,
108
		InstanceService instanceService)
107
	{
109
	{
108
		this.world = world;
110
		this.world = world;
109
		this.itemService = itemService;
111
		this.itemService = itemService;
...
...
116
		this.duelService = duelService;
118
		this.duelService = duelService;
117
		this.playerStatsData = playerStatsData;
119
		this.playerStatsData = playerStatsData;
118
		this.playerInitialData = playerInitialData;
120
		this.playerInitialData = playerInitialData;
121
		this.instanceService = instanceService;
119
	}
122
	}
120
123
121
	/**
124
	/**
...
...
258
		{
261
		{
259
			TitleChangeListener.onTitleChange(player.getGameStats(), player.getCommonData().getTitleId(), true);
262
			TitleChangeListener.onTitleChange(player.getGameStats(), player.getCommonData().getTitleId(), true);
260
		}
263
		}
261
264
		
265
		//analyze current instance
266
		instanceService.onPlayerLogin(player);
267
		
262
		if(CacheConfig.CACHE_PLAYERS)
268
		if(CacheConfig.CACHE_PLAYERS)
263
			playerCache.put(playerObjId, player);
269
			playerCache.put(playerObjId, player);
264
270

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

15131514
286
	 */
286
	 */
287
	private void changePosition(Player player, int worldId, int instanceId, float x, float y, float z, byte heading)
287
	private void changePosition(Player player, int worldId, int instanceId, float x, float y, float z, byte heading)
288
	{
288
	{
289
		if(player.getInstanceId() != instanceId || player.getWorldId() != worldId)
290
		{
291
			world.getWorldMap(player.getWorldId()).getWorldMapInstanceById(player.getInstanceId()).removePlayer(
292
				player.getObjectId());
293
			world.getWorldMap(worldId).getWorldMapInstanceById(instanceId).addPlayer(player.getObjectId());
294
		}
295
		world.despawn(player);
289
		world.despawn(player);
296
		world.setPosition(player, worldId, instanceId, x, y, z, heading);
290
		world.setPosition(player, worldId, instanceId, x, y, z, heading);
297
		player.getController().startProtectionActiveTask();
291
		player.getController().startProtectionActiveTask();
...
...
375
		}
369
		}
376
		else
370
		else
377
		{
371
		{
378
			if(player.getInstanceId() != 1 || player.getWorldId() != worldId)
372
			world.setPosition(player, worldId, 1, x, y, z, player.getHeading());
379
			{
380
				world.getWorldMap(player.getWorldId()).getWorldMapInstanceById(player.getInstanceId()).removePlayer(
381
					player.getObjectId());
382
				world.getWorldMap(worldId).getWorldMapInstanceById(1).addPlayer(player.getObjectId());
383
			}
384
			world.setPosition(player, worldId, x, y, z, player.getHeading());
385
		}
373
		}
386
	}
374
	}
387
	
375
	

Updated trunk/AE-go_GameServer/src/com/aionemu/gameserver/utils/guice/DataInjectionModule.java Download diff

15131514
48
import com.aionemu.gameserver.services.DuelService;
48
import com.aionemu.gameserver.services.DuelService;
49
import com.aionemu.gameserver.services.ExchangeService;
49
import com.aionemu.gameserver.services.ExchangeService;
50
import com.aionemu.gameserver.services.GroupService;
50
import com.aionemu.gameserver.services.GroupService;
51
import com.aionemu.gameserver.services.InstanceService;
51
import com.aionemu.gameserver.services.ItemService;
52
import com.aionemu.gameserver.services.ItemService;
52
import com.aionemu.gameserver.services.LegionService;
53
import com.aionemu.gameserver.services.LegionService;
53
import com.aionemu.gameserver.services.MailService;
54
import com.aionemu.gameserver.services.MailService;
...
...
126
		bind(ServiceProxy.class).in(Scopes.SINGLETON);
127
		bind(ServiceProxy.class).in(Scopes.SINGLETON);
127
		bind(QuestService.class).in(Scopes.SINGLETON);
128
		bind(QuestService.class).in(Scopes.SINGLETON);
128
		bind(MailService.class).in(Scopes.SINGLETON);
129
		bind(MailService.class).in(Scopes.SINGLETON);
130
		bind(InstanceService.class).in(Scopes.SINGLETON);
129
	}
131
	}
130
132
131
	@Provides
133
	@Provides

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

15131514
136
	void add(VisibleObject object)
136
	void add(VisibleObject object)
137
	{
137
	{
138
		objects.put(object.getObjectId(), object);
138
		objects.put(object.getObjectId(), object);
139
		parent.onEnter(object);
140
	}
139
	}
141
140
142
	/**
141
	/**
...
...
147
	void remove(VisibleObject object)
146
	void remove(VisibleObject object)
148
	{
147
	{
149
		objects.remove(object.getObjectId());
148
		objects.remove(object.getObjectId());
150
		parent.onLeave(object);
151
	}
149
	}
152
}
150
}

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

15131514
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;
34
import com.aionemu.gameserver.taskmanager.tasks.KnownListUpdateTask.KnownListUpdateMode;
33
import com.aionemu.gameserver.taskmanager.tasks.KnownListUpdateTask.KnownListUpdateMode;
35
import com.aionemu.gameserver.utils.idfactory.IDFactory;
34
import com.aionemu.gameserver.utils.idfactory.IDFactory;
36
import com.aionemu.gameserver.utils.idfactory.IDFactoryAionObject;
35
import com.aionemu.gameserver.utils.idfactory.IDFactoryAionObject;
...
...
71
	private final Map<Integer, WorldMap>	worldMaps	= new HashMap<Integer, WorldMap>();
70
	private final Map<Integer, WorldMap>	worldMaps	= new HashMap<Integer, WorldMap>();
72
71
73
	private IDFactory						aionObjectsIDFactory;
72
	private IDFactory						aionObjectsIDFactory;
74
	@Inject
75
	private SpawnEngine						spawnEngine;
76
73
77
	/**
74
	/**
78
	 * Constructor.
75
	 * Constructor.
...
...
177
	}
174
	}
178
175
179
	/**
176
	/**
180
	 * @return the spawnEngine
181
	 */
182
	public SpawnEngine getSpawnEngine()
183
	{
184
		return spawnEngine;
185
	}
186
187
	/**
188
	 * Return World Map by id
177
	 * Return World Map by id
189
	 * 
178
	 * 
190
	 * @param id
179
	 * @param id
...
...
201
			throw new WorldMapNotExistException("Map: " + id + " not exist!");
190
			throw new WorldMapNotExistException("Map: " + id + " not exist!");
202
		return map;
191
		return map;
203
	}
192
	}
204
	
205
	/**
206
	 * 
207
	 * @param worldId
208
	 * @return WorldMapInstance
209
	 */
210
	public WorldMapInstance getNextAvailableInstance(int worldId)
211
	{
212
		WorldMap map = worldMaps.get(worldId);
213
		return map.getNextFreeInstance();
214
	}
215
193
216
	public void destroyInstance(int worldId, int instanceId)
217
	{
218
		WorldMap map = worldMaps.get(worldId);
219
		map.removeWorldMapInstance(instanceId);
220
	}
221
222
	/**
194
	/**
223
	 * Update position of VisibleObject [used when object is moving on one map instance]. Check if active map region
195
	 * Update position of VisibleObject [used when object is moving on one map instance]. Check if active map region
224
	 * changed and do all needed updates.
196
	 * changed and do all needed updates.
...
...
349
		object.getPosition().setIsSpawned(true);
321
		object.getPosition().setIsSpawned(true);
350
		if(object.getSpawn() != null)
322
		if(object.getSpawn() != null)
351
			object.getSpawn().setSpawned(true, object.getInstanceId());
323
			object.getSpawn().setSpawned(true, object.getInstanceId());
324
		object.getActiveRegion().getParent().addObject(object);
352
		object.getActiveRegion().add(object);
325
		object.getActiveRegion().add(object);
353
326
354
		object.updateKnownlist();
327
		object.updateKnownlist();
...
...
363
	 */
336
	 */
364
	public void despawn(VisibleObject object)
337
	public void despawn(VisibleObject object)
365
	{
338
	{
339
		object.getActiveRegion().getParent().removeObject(object);
366
		object.getActiveRegion().remove(object);
340
		object.getActiveRegion().remove(object);
367
		object.getPosition().setIsSpawned(false);
341
		object.getPosition().setIsSpawned(false);
368
		if(object.getSpawn() != null)
342
		if(object.getSpawn() != null)
...
...
370
344
371
		object.clearKnownlist();
345
		object.clearKnownlist();
372
	}
346
	}
373
374
	/**
375
	 * dummy method to initialize World.
376
	 */
377
	public static void init()
378
	{
379
	}
380
}
347
}

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

15131514
17
package com.aionemu.gameserver.world;
17
package com.aionemu.gameserver.world;
18
18
19
import java.util.HashMap;
19
import java.util.HashMap;
20
import java.util.Iterator;
20
import java.util.Map;
21
import java.util.Map;
21
22
22
import org.apache.log4j.Logger;
23
24
import com.aionemu.gameserver.model.templates.WorldMapTemplate;
23
import com.aionemu.gameserver.model.templates.WorldMapTemplate;
25
24
26
/**
25
/**
...
...
31
 */
30
 */
32
public class WorldMap
31
public class WorldMap
33
{
32
{
34
	private static Logger log = Logger.getLogger(WorldMap.class);
35
	
36
	private WorldMapTemplate				worldMapTemplate;
33
	private WorldMapTemplate				worldMapTemplate;
37
34
38
	private int nextInstanceId = 1;
35
	private int nextInstanceId = 1;
...
...
84
		int twinCount = worldMapTemplate.getTwinCount();
81
		int twinCount = worldMapTemplate.getTwinCount();
85
		return twinCount > 0 ? twinCount : 1;
82
		return twinCount > 0 ? twinCount : 1;
86
	}
83
	}
87
	
88
	/**
89
	 *  Will create new instance if there are not free yet and spawn according to xml data
90
	 *  //TODO limit
91
	 * @return WorldMapInstance
92
	 */
93
	public synchronized WorldMapInstance getNextFreeInstance()
94
	{	
95
		if (!worldMapTemplate.isInstance())
96
		{
97
			for(WorldMapInstance instance : instances.values())
98
			{
99
				if(!instance.isInUse())
100
					return instance;
101
			}
102
		}
103
		log.info("Creating new instance: " + worldMapTemplate.getMapId() + " " + nextInstanceId );
104
		if (worldMapTemplate.isInstance())
105
			addInstance(nextInstanceId, new WorldMapScriptInstance(this, nextInstanceId));
106
		else
107
			addInstance(nextInstanceId, new WorldMapInstance(this, nextInstanceId));
108
		world.getSpawnEngine().spawnInstance(worldMapTemplate.getMapId(), nextInstanceId-1);
109
		
110
		return instances.get(nextInstanceId-1);
111
	}
112
84
113
	/**
85
	/**
114
	 * Return a WorldMapInstance - depends on map configuration one map may have twins instances to balance player. This
86
	 * Return a WorldMapInstance - depends on map configuration one map may have twins instances to balance player. This
115
	 * method will return WorldMapInstance by server chose.
87
	 * method will return WorldMapInstance by server chose.
116
	 * 
88
	 *  
89
	 *  
117
	 * @return WorldMapInstance.
90
	 * @return WorldMapInstance.
118
	 */
91
	 */
119
	public WorldMapInstance getWorldMapInstance()
92
	public WorldMapInstance getWorldMapInstance()
120
	{
93
	{
121
		/**
94
		//TODO Balance players into instances.
122
		 * twin map - balance players
95
		return getWorldMapInstance(1);
123
		 */
124
		if(worldMapTemplate.getTwinCount() != 0)
125
		{
126
			/**
127
			 * Balance players into instances.
128
			 */
129
			int i = 1;
130
			while(i <= worldMapTemplate.getTwinCount())
131
			{		
132
				WorldMapInstance inst = getWorldMapInstance(i);
133
				i++;
134
				// TODO! user count etc..
135
				return inst;
136
			}
137
			// TODO! whats now?
138
			return getWorldMapInstance(worldMapTemplate.getTwinCount());
139
		}
140
		else
141
			return getWorldMapInstance(1);
142
	}
96
	}
143
	
97
	
144
	/**
98
	/**
...
...
174
	 * Remove WorldMapInstance by instanceId.
128
	 * Remove WorldMapInstance by instanceId.
175
	 * 
129
	 * 
176
	 * @param instanceId
130
	 * @param instanceId
177
	 * @return WorldMapInstance/
178
	 */
131
	 */
179
	public WorldMapInstance removeWorldMapInstance(int instanceId)
132
	public void removeWorldMapInstance(int instanceId)
180
	{
133
	{
181
		WorldMapInstance instance = instances.get(instanceId);
134
		instances.remove(instanceId);
182
		if (instance != null)
183
		{
184
			instance.destroyInstance();
185
			return instances.remove(instanceId);
186
		}
187
		return null;
188
	}
135
	}
189
136
	
190
	public int getWorldMapScriptInstanceIdByPlyerObjId(int objId)
137
	/**
138
	 *  Add instance to map and increases pointer to nextInstanceId
139
	 *  
140
	 * @param instanceId
141
	 * @param instance
142
	 */
143
	public void addInstance(int instanceId, WorldMapInstance instance)
191
	{
144
	{
192
		for (WorldMapInstance instance : instances.values())
193
		{
194
			if (instance.isInInstance(objId))
195
				return instance.getInstanceId();
196
		}
197
		return -1;
198
	}
199
200
	private void addInstance(int instanceId, WorldMapInstance instance)
201
	{
202
		instances.put(instanceId, instance);
145
		instances.put(instanceId, instance);
203
		nextInstanceId++;
146
		nextInstanceId++;
204
	}
147
	}
...
...
209
	{
152
	{
210
		return world;
153
		return world;
211
	}
154
	}
155
156
	/**
157
	 * @return the nextInstanceId
158
	 */
159
	public int getNextInstanceId()
160
	{
161
		return nextInstanceId;
162
	}
163
164
	/**
165
	 *  Whether this world map is instance type
166
	 *  
167
	 * @return
168
	 */
169
	public boolean isInstanceType()
170
	{
171
		return worldMapTemplate.isInstance();
172
	}
173
	
174
	/**
175
	 * @return
176
	 */
177
	public Iterator<WorldMapInstance> iterator()
178
	{
179
		return instances.values().iterator();
180
	}
212
}
181
}

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

15131514
16
 */
16
 */
17
package com.aionemu.gameserver.world;
17
package com.aionemu.gameserver.world;
18
18
19
import java.util.Collections;
19
import java.util.HashMap;
20
import java.util.HashMap;
21
import java.util.Iterator;
20
import java.util.Map;
22
import java.util.Map;
23
import java.util.Set;
24
import java.util.concurrent.ConcurrentHashMap;
25
import java.util.concurrent.Future;
21
26
27
import com.aionemu.gameserver.model.gameobjects.AionObject;
22
import com.aionemu.gameserver.model.gameobjects.VisibleObject;
28
import com.aionemu.gameserver.model.gameobjects.VisibleObject;
23
import com.aionemu.gameserver.model.gameobjects.player.Player;
29
import com.aionemu.gameserver.model.gameobjects.player.Player;
30
import com.aionemu.gameserver.world.exceptions.DuplicateAionObjectException;
24
31
25
/**
32
/**
26
 * World map instance object.
33
 * World map instance object.
...
...
33
	/**
40
	/**
34
	 * Size of region
41
	 * Size of region
35
	 */
42
	 */
36
	public static final int				regionSize		= 500;
43
	public static final int						regionSize			= 500;
37
	/**
44
	/**
38
	 * Max world size - actually it must be some value bigger than world size. Used only for id generation.
45
	 * Max world size - actually it must be some value bigger than world size. Used only for id generation.
39
	 */
46
	 */
40
	private static final int				maxWorldSize	= 10000;
47
	private static final int					maxWorldSize		= 10000;
41
	/**
48
	/**
42
	 * WorldMap witch is parent of this instance.
49
	 * WorldMap witch is parent of this instance.
43
	 */
50
	 */
44
	private final WorldMap					parent;
51
	private final WorldMap						parent;
45
	/**
52
	/**
46
	 * List of active regions.
53
	 * Map of active regions.
47
	 */
54
	 */
48
	private final Map<Integer, MapRegion>	regions			= new HashMap<Integer, MapRegion>();
55
	private final Map<Integer, MapRegion>		regions				= new HashMap<Integer, MapRegion>();
49
	
56
50
	/**
57
	/**
51
	 * Current player count in this instance
58
	 * All objects spawned in this world map instance
52
	 */
59
	 */
53
	private int 							currentPlayerCount;
60
	private final Map<Integer, VisibleObject>	worldMapObjects		= new ConcurrentHashMap<Integer, VisibleObject>();
54
	
61
55
	private int								instanceId;
56
	/**
62
	/**
63
	 * All players spawned in this world map instance
64
	 */
65
	private final Map<Integer, Player>			worldMapPlayers		= new ConcurrentHashMap<Integer, Player>();
66
67
	private final Set<Integer>					registeredObjects	= Collections
68
																		.newSetFromMap(new ConcurrentHashMap<Integer, Boolean>());
69
70
	/**
71
	 * Id of this instance (channel)
72
	 */
73
	private int									instanceId;
74
	/**
75
	 * Destroy task of this instance
76
	 */
77
	private Future<?>							destroyTask;
78
	/**
57
	 * Constructor.
79
	 * Constructor.
58
	 *
80
	 *
59
	 * @param parent
81
	 * @param parent
60
	 */
82
	 */
61
	WorldMapInstance(WorldMap parent, int instanceId)
83
	public WorldMapInstance(WorldMap parent, int instanceId)
62
	{
84
	{
63
		this.parent = parent;
85
		this.parent = parent;
64
		this.instanceId = instanceId;
86
		this.instanceId = instanceId;
...
...
174
	{
196
	{
175
		return getParent().getWorld();
197
		return getParent().getWorld();
176
	}
198
	}
177
199
	
178
	/**
200
	/**
179
	 * @return the currentPlayerCount
201
	 * 
202
	 * @param object
180
	 */
203
	 */
181
	public int getCurrentPlayerCount()
204
	public void addObject(VisibleObject object)
182
	{
205
	{
183
		return currentPlayerCount;
206
		if(worldMapObjects.put(object.getObjectId(), object) != null)
207
			throw new DuplicateAionObjectException();
208
209
		if(object instanceof Player)
210
			worldMapPlayers.put(object.getObjectId(), (Player) object);
184
	}
211
	}
185
	
212
	
186
	public void onEnter(VisibleObject object)
213
	/**
214
	 * 
215
	 * @param object
216
	 */
217
	public void removeObject(AionObject object)
187
	{
218
	{
188
		if (object instanceof Player)
219
		worldMapObjects.remove(object.getObjectId());
189
			currentPlayerCount++;
220
		if(object instanceof Player)
221
			worldMapPlayers.remove(object.getObjectId());
190
	}
222
	}
191
	
192
	public void onLeave(VisibleObject object)
193
	{
194
		if (object instanceof Player)
195
			currentPlayerCount--;
196
	}
197
	
198
	public boolean isInUse()
199
	{
200
		return currentPlayerCount > 0;
201
	}
202
223
203
	/**
224
	/**
204
	 * @return the instanceIndex
225
	 * @return the instanceIndex
...
...
208
		return instanceId;
229
		return instanceId;
209
	}
230
	}
210
	
231
	
232
	/**
233
	 *  Check player is in instance
234
	 *  
235
	 * @param objId
236
	 * @return
237
	 */
211
	public boolean isInInstance(int objId)
238
	public boolean isInInstance(int objId)
212
	{
239
	{
213
		return false;
240
		return worldMapPlayers.containsKey(objId);
214
	}
241
	}
215
242
216
	public void setDestroyTime(int sec)
243
	/**
217
	{	
244
	 * @return the destroyTask
245
	 */
246
	public Future<?> getDestroyTask()
247
	{
248
		return destroyTask;
218
	}
249
	}
219
250
220
	public void destroyInstance()
251
	/**
252
	 * @param destroyTask the destroyTask to set
253
	 */
254
	public void setDestroyTask(Future<?> destroyTask)
221
	{
255
	{
256
		this.destroyTask = destroyTask;
222
	}
257
	}
223
258
	
224
	public void addPlayer(int objId)
259
	/**
260
	 * @return
261
	 */
262
	public Iterator<VisibleObject> objectIterator()
225
	{
263
	{
264
		return worldMapObjects.values().iterator();
226
	}
265
	}
266
	
267
	/**
268
	 * @return
269
	 */
270
	public Iterator<Player> playerIterator()
271
	{
272
		return worldMapPlayers.values().iterator();
273
	}
274
	
275
	/**
276
	 * @param objectId
277
	 */
278
	public void register(int objectId)
279
	{
280
		registeredObjects.add(objectId);
281
	}
227
282
228
	public void removePlayer(int objId)
283
	/**
284
	 * @param objectId
285
	 * @return
286
	 */
287
	public boolean isRegistered(int objectId)
229
	{
288
	{
289
		return registeredObjects.contains(objectId);
230
	}
290
	}
231
}
291
}

Added trunk/AE-go_GameServer/src/com/aionemu/gameserver/world/WorldType.java

Show contents