mirror of
https://github.com/ProjectSWGCore/Holocore.git
synced 2026-10-19 09:03:02 -04:00
152 lines
6.9 KiB
Java
152 lines
6.9 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.util.Map.Entry;
|
|
|
|
import resources.client_info.ClientFactory;
|
|
import resources.client_info.visitors.ObjectData;
|
|
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.installation.InstallationObject;
|
|
import resources.objects.intangible.IntangibleObject;
|
|
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 {
|
|
|
|
public static SWGObject createObjectFromTemplate(long objectId, String template) {
|
|
if (!template.startsWith("object/"))
|
|
return null;
|
|
if (!template.endsWith(".iff"))
|
|
return null;
|
|
SWGObject obj = createObjectFromType(objectId, getFirstTemplatePart(template.substring(7, template.length())));
|
|
if (obj == null)
|
|
return null;
|
|
obj.setTemplate(template);
|
|
|
|
handlePostCreation(obj);
|
|
return obj;
|
|
}
|
|
|
|
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 "installation": return new InstallationObject(objectId);
|
|
case "intangible": return new IntangibleObject(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<String, Object> e : attributes.getAttributes().entrySet()) {
|
|
obj.setTemplateAttribute(e.getKey(), e.getValue());
|
|
|
|
setObjectAttribute(e.getKey(), e.getValue().toString(), obj);
|
|
}
|
|
}
|
|
|
|
private static void setObjectAttribute(String key, String value, SWGObject object) {
|
|
switch(key) {
|
|
case ObjectData.OBJ_STF: object.setStringId(value); break;
|
|
case ObjectData.DETAIL_STF: object.setDetailStringId(value); break;
|
|
case ObjectData.VOLUME_LIMIT: object.setVolume(Integer.parseInt(value)); break;
|
|
case ObjectData.CONTAINER_TYPE: object.setContainerType(Integer.parseInt(value)); break;
|
|
default: break;
|
|
}
|
|
}
|
|
|
|
private static void createObjectSlots(SWGObject object) {
|
|
if (object.getTemplateAttribute(ObjectData.SLOT_DESCRIPTOR) != null) {
|
|
// These are the slots that the object *HAS*
|
|
SlotDescriptorData descriptor = (SlotDescriptorData) ClientFactory.getInfoFromFile((String) object.getTemplateAttribute(ObjectData.SLOT_DESCRIPTOR), true);
|
|
if (descriptor == null)
|
|
return;
|
|
|
|
for (String slotName : descriptor.getSlots()) {
|
|
object.getSlots().put(slotName, null);
|
|
}
|
|
}
|
|
|
|
if (object.getTemplateAttribute(ObjectData.ARRANGEMENT_FILE) != null) {
|
|
// This is what slots the created object is able to go into/use
|
|
SlotArrangementData arrangementData = (SlotArrangementData) ClientFactory.getInfoFromFile((String) object.getTemplateAttribute(ObjectData.ARRANGEMENT_FILE), true);
|
|
if (arrangementData == null)
|
|
return;
|
|
|
|
object.setArrangement(arrangementData.getArrangement());
|
|
}
|
|
}
|
|
|
|
/*
|
|
Misc helper methods
|
|
*/
|
|
private static String getFirstTemplatePart(String template) {
|
|
int ind = template.indexOf('/');
|
|
if (ind == -1)
|
|
return "";
|
|
return template.substring(0, ind);
|
|
}
|
|
|
|
}
|