mirror of
https://github.com/ProjectSWGCore/Holocore.git
synced 2026-10-17 07:02:54 -04:00
211 lines
8.7 KiB
Java
211 lines
8.7 KiB
Java
/***********************************************************************************
|
|
* Copyright (c) 2015 /// Project SWG /// www.projectswg.com *
|
|
* *
|
|
* ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on *
|
|
* July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. *
|
|
* Our goal is to create an emulator which will provide a server for players to *
|
|
* continue playing a game similar to the one they used to play. We are basing *
|
|
* it on the final publish of the game prior to end-game events. *
|
|
* *
|
|
* This file is part of Holocore. *
|
|
* *
|
|
* -------------------------------------------------------------------------------- *
|
|
* *
|
|
* Holocore is free software: you can redistribute it and/or modify *
|
|
* it under the terms of the GNU Affero General Public License as *
|
|
* published by the Free Software Foundation, either version 3 of the *
|
|
* License, or (at your option) any later version. *
|
|
* *
|
|
* Holocore is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
* GNU Affero General Public License for more details. *
|
|
* *
|
|
* You should have received a copy of the GNU Affero General Public License *
|
|
* along with Holocore. If not, see <http://www.gnu.org/licenses/>. *
|
|
* *
|
|
***********************************************************************************/
|
|
package services.objects;
|
|
|
|
import java.lang.reflect.InvocationTargetException;
|
|
import java.util.Map.Entry;
|
|
|
|
import resources.client_info.ClientFactory;
|
|
import resources.client_info.visitors.ObjectData;
|
|
import resources.client_info.visitors.ObjectData.ObjectDataAttribute;
|
|
import resources.client_info.visitors.SlotArrangementData;
|
|
import resources.client_info.visitors.SlotDescriptorData;
|
|
import resources.objects.SWGObject;
|
|
import resources.objects.building.BuildingObject;
|
|
import resources.objects.cell.CellObject;
|
|
import resources.objects.creature.CreatureObject;
|
|
import resources.objects.factory.FactoryObject;
|
|
import resources.objects.group.GroupObject;
|
|
import resources.objects.guild.GuildObject;
|
|
import resources.objects.installation.InstallationObject;
|
|
import resources.objects.intangible.IntangibleObject;
|
|
import resources.objects.manufacture.ManufactureSchematicObject;
|
|
import resources.objects.player.PlayerObject;
|
|
import resources.objects.resource.ResourceContainerObject;
|
|
import resources.objects.ship.ShipObject;
|
|
import resources.objects.sound.SoundObject;
|
|
import resources.objects.staticobject.StaticObject;
|
|
import resources.objects.tangible.TangibleObject;
|
|
import resources.objects.waypoint.WaypointObject;
|
|
import resources.objects.weapon.WeaponObject;
|
|
|
|
public final class ObjectCreator {
|
|
|
|
private static final Object OBJECT_ID_MUTEX = new Object();
|
|
private static long maxObjectId = 1;
|
|
|
|
public static void updateMaxObjectId(long objectId) {
|
|
synchronized (OBJECT_ID_MUTEX) {
|
|
if (objectId > maxObjectId)
|
|
maxObjectId = objectId;
|
|
}
|
|
}
|
|
|
|
public static SWGObject createObjectFromTemplate(long objectId, String template) {
|
|
if (!template.startsWith("object/"))
|
|
return null;
|
|
if (!template.endsWith(".iff"))
|
|
return null;
|
|
SWGObject obj = createObjectFromType(objectId, getTemplatePart(template, 1));
|
|
if (obj == null)
|
|
return null;
|
|
obj.setTemplate(template);
|
|
|
|
handlePostCreation(obj);
|
|
updateMaxObjectId(objectId);
|
|
return obj;
|
|
}
|
|
|
|
public static <T extends SWGObject> T createObjectFromTemplate(long objectId, String template, Class <T> c) {
|
|
T obj;
|
|
try {
|
|
obj = c.getConstructor(Integer.TYPE).newInstance(objectId);
|
|
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
|
|
e.printStackTrace();
|
|
obj = null;
|
|
}
|
|
if (obj == null)
|
|
return null;
|
|
obj.setTemplate(template);
|
|
|
|
handlePostCreation(obj);
|
|
updateMaxObjectId(objectId);
|
|
return obj;
|
|
}
|
|
|
|
public static SWGObject createObjectFromTemplate(String template) {
|
|
long id = 0;
|
|
synchronized (OBJECT_ID_MUTEX) {
|
|
id = maxObjectId++;
|
|
}
|
|
return createObjectFromTemplate(id, template);
|
|
}
|
|
|
|
public static <T extends SWGObject> T createObjectFromTemplate(String template, Class <T> c) {
|
|
long id = 0;
|
|
synchronized (OBJECT_ID_MUTEX) {
|
|
id = maxObjectId++;
|
|
}
|
|
return createObjectFromTemplate(id, template, c);
|
|
}
|
|
|
|
private static SWGObject createObjectFromType(long objectId, String type) {
|
|
switch (type) {
|
|
case "building": return new BuildingObject(objectId);
|
|
case "cell": return new CellObject(objectId);
|
|
case "creature": return new CreatureObject(objectId);
|
|
case "factory": return new FactoryObject(objectId);
|
|
case "group": return new GroupObject(objectId);
|
|
case "guild": return new GuildObject(objectId);
|
|
case "installation": return new InstallationObject(objectId);
|
|
case "intangible": return new IntangibleObject(objectId);
|
|
case "manufacture_schematic": return new ManufactureSchematicObject(objectId);
|
|
case "mobile": return new CreatureObject(objectId);
|
|
case "player": return new PlayerObject(objectId);
|
|
case "resource_container": return new ResourceContainerObject(objectId);
|
|
case "ship": return new ShipObject(objectId);
|
|
case "soundobject": return new SoundObject(objectId);
|
|
case "static": return new StaticObject(objectId);
|
|
case "tangible": return new TangibleObject(objectId);
|
|
case "waypoint": return new WaypointObject(objectId);
|
|
case "weapon": return new WeaponObject(objectId);
|
|
default: System.err.println("Unknown type: " + type); return null;
|
|
}
|
|
}
|
|
|
|
private static void handlePostCreation(SWGObject object) {
|
|
addObjectAttributes(object, object.getTemplate());
|
|
createObjectSlots(object);
|
|
}
|
|
|
|
private static void addObjectAttributes(SWGObject obj, String template) {
|
|
ObjectData attributes = (ObjectData) ClientFactory.getInfoFromFile(ClientFactory.formatToSharedFile(template), true);
|
|
|
|
if (attributes == null)
|
|
return;
|
|
|
|
for (Entry<ObjectDataAttribute, Object> e : attributes.getAttributes().entrySet()) {
|
|
setObjectAttribute(e.getKey(), e.getValue(), obj);
|
|
}
|
|
}
|
|
|
|
private static void setObjectAttribute(ObjectDataAttribute key, Object value, SWGObject object) {
|
|
object.setDataAttribute(key, value);
|
|
switch (key) {
|
|
case OBJECT_NAME: object.setStringId(value.toString()); break;
|
|
case DETAILED_DESCRIPTION: object.setDetailStringId(value.toString()); break;
|
|
case CONTAINER_VOLUME_LIMIT: object.setVolume((Integer) value); break;
|
|
case CONTAINER_TYPE: object.setContainerType((Integer) value); break;
|
|
default: break;
|
|
}
|
|
}
|
|
|
|
private static void createObjectSlots(SWGObject object) {
|
|
if (object.getDataAttribute(ObjectDataAttribute.SLOT_DESCRIPTOR_FILENAME) != null) {
|
|
// These are the slots that the object *HAS*
|
|
SlotDescriptorData descriptor = (SlotDescriptorData) ClientFactory.getInfoFromFile((String) object.getDataAttribute(ObjectDataAttribute.SLOT_DESCRIPTOR_FILENAME), true);
|
|
if (descriptor == null)
|
|
return;
|
|
|
|
for (String slotName : descriptor.getSlots()) {
|
|
object.setSlot(slotName, null);
|
|
}
|
|
}
|
|
|
|
if (object.getDataAttribute(ObjectDataAttribute.ARRANGEMENT_DESCRIPTOR_FILENAME) != null) {
|
|
// This is what slots the created object is able to go into/use
|
|
SlotArrangementData arrangementData = (SlotArrangementData) ClientFactory.getInfoFromFile((String) object.getDataAttribute(ObjectDataAttribute.ARRANGEMENT_DESCRIPTOR_FILENAME), true);
|
|
if (arrangementData == null)
|
|
return;
|
|
|
|
object.setArrangement(arrangementData.getArrangement());
|
|
}
|
|
}
|
|
|
|
/*
|
|
Misc helper methods
|
|
*/
|
|
private static String getTemplatePart(String template, int index) {
|
|
int start = 0;
|
|
int end = 0;
|
|
for (int i = 0; i < template.length(); i++) {
|
|
if (template.charAt(i) != '/')
|
|
continue;
|
|
index--;
|
|
if (index == 0)
|
|
start = i+1;
|
|
else if (index == -1) {
|
|
end = i;
|
|
break;
|
|
}
|
|
}
|
|
return template.substring(start, end);
|
|
}
|
|
|
|
}
|