Merge remote-tracking branch 'origin/master' into LootSystem

Conflicts:
	src/main/NGECore.java
	src/services/DevService.java
This commit is contained in:
CharonInferar
2014-04-10 00:38:13 +02:00
22 changed files with 580 additions and 1776 deletions
+26
View File
@@ -0,0 +1,26 @@
import sys
def setup():
return
def run(core, actor, target, commandString):
cmdArgs = commandString.split(" ")
deedId = long(cmdArgs[0])
deed = core.objectService.getObject(deedId)
positionX = float(cmdArgs[1])
positionZ = float(cmdArgs[2])
#positionY = core.terrainService.getHeight(actor.getPlanetId(), positionX, positionZ) + 2
rotation = float(cmdArgs[3])
#structureTemplate = deed.getAttachment("structureTemplate")
core.housingService.placeStructure(actor, deed, positionX, positionZ, rotation)
#building = core.objectService.createObject(structureTemplate, actor.getPlanet(), positionX, positionZ, positionY);
#core.simulationService.add(building, building.getPosition().x, building.getPosition().z);
return
+2 -2
View File
@@ -1,9 +1,9 @@
import sys
def addAbilities(core, actor, player):
actor.addAbility("expertise_of_purge_1")
actor.addAbility("of_purge_1")
return
def removeAbilities(core, actor, player):
actor.removeAbility("expertise_of_purge_1")
actor.removeAbility("of_purge_1")
return
@@ -0,0 +1,19 @@
import sys
from services.housing import HouseTemplate
from engine.resources.scene import Point3D
def setup(core):
houseTemplate = HouseTemplate("object/tangible/deed/player_house_deed/shared_generic_house_small_deed.iff", "object/building/player/shared_player_house_generic_small_style_01.iff", 2)
houseTemplate.addBuildingSign("object/tangible/sign/player/shared_house_address.iff", Point3D(1, 2, 3))
houseTemplate.addPlaceablePlanet("tatooine")
houseTemplate.addPlaceablePlanet("corellia")
houseTemplate.addPlaceablePlanet("naboo")
houseTemplate.addPlaceablePlanet("talus")
houseTemplate.addPlaceablePlanet("rori")
houseTemplate.addPlaceablePlanet("dantooine")
houseTemplate.addPlaceablePlanet("lok")
houseTemplate.setDefaultItemLimit(200)
core.housingService.addHousingTemplate(houseTemplate)
return
@@ -1,4 +1,9 @@
import sys
def setup(core, object):
sign = core.objectService.createChildObject(object, 'object/tangible/sign/player/shared_house_address.iff', -7.39, 2.36, 2, -1, 0, -1)
print(sign)
object.setAttachment("structureSign", sign)
core.objectService.createChildObject(object, 'object/tangible/terminal/shared_terminal_player_structure.iff', -5, 0.74, -1.81, 0.707107, -0.707107, 1)
return
@@ -1,4 +1,8 @@
import sys
def setup(core, object):
object.setAttachment('radial_filename', 'structureDeed');
return
def use(core, actor, object):
return
+11
View File
@@ -0,0 +1,11 @@
from resources.common import RadialOptions
import sys
def createRadial(core, owner, target, radials):
return
def handleSelection(core, owner, target, option):
if option == 21 and target:
core.housingService.enterStructureMode(owner, target)
return
-709
View File
@@ -1,709 +0,0 @@
/*******************************************************************************
* Copyright (c) 2013 <Project SWG>
*
* This File is part of NGECore2.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Using NGEngine to work with NGECore2 is making a combined work based on NGEngine.
* Therefore all terms and conditions of the GNU Lesser General Public License cover the combination.
******************************************************************************/
package main;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.apache.mina.core.service.IoHandler;
import org.apache.mina.core.session.IoSession;
import com.sleepycat.je.Transaction;
import com.sleepycat.persist.EntityCursor;
import protocol.swg.ChatSystemMessage;
import net.engio.mbassy.bus.config.BusConfiguration;
import resources.common.RadialOptions;
import resources.common.ThreadMonitor;
import resources.objects.creature.CreatureObject;
import services.AttributeService;
import services.BuffService;
import services.CharacterService;
import services.ConnectionService;
import services.ConversationService;
import services.DevService;
import services.EntertainmentService;
import services.EquipmentService;
import services.GroupService;
import services.InstanceService;
import services.LoginService;
import services.LootService;
import services.MissionService;
import services.PlayerService;
import services.ScriptService;
import services.SimulationService;
import services.SkillModService;
import services.SkillService;
import services.StaticService;
import services.SurveyService;
import services.TerrainService;
import services.WeatherService;
import services.ai.AIService;
import services.chat.ChatService;
import services.collections.CollectionService;
import services.combat.CombatService;
import services.command.CombatCommand;
import services.command.CommandService;
import services.gcw.FactionService;
import services.gcw.GCWService;
import services.guild.GuildService;
import services.LoginService;
import services.map.MapService;
import services.object.ObjectService;
import services.object.UpdateService;
import services.resources.ResourceService;
import services.retro.RetroService;
import services.spawn.SpawnService;
import services.sui.SUIService;
import services.trade.TradeService;
import services.travel.TravelService;
import engine.clientdata.ClientFileManager;
import engine.clientdata.visitors.CrcStringTableVisitor;
import engine.clientdata.visitors.DatatableVisitor;
import engine.clientdata.visitors.LevelOfDetailVisitor;
import engine.clientdata.visitors.MeshVisitor;
import engine.clientdata.visitors.PortalVisitor;
import engine.clientdata.visitors.TerrainVisitor;
import engine.clientdata.visitors.WorldSnapshotVisitor;
import engine.clientdata.visitors.WorldSnapshotVisitor.SnapshotChunk;
import engine.clients.Client;
import engine.resources.common.CRC;
import engine.resources.common.PHPBB3Auth;
import engine.resources.config.Config;
import engine.resources.config.DefaultConfig;
import engine.resources.container.Traverser;
import engine.resources.database.DatabaseConnection;
import engine.resources.database.ObjectDatabase;
import engine.resources.objects.SWGObject;
import engine.resources.scene.Point3D;
import engine.resources.scene.Quaternion;
import engine.resources.service.InteractiveJythonAcceptor;
import engine.resources.service.NetworkDispatch;
import engine.servers.InteractiveJythonServer;
import engine.servers.MINAServer;
import engine.servers.PingServer;
@SuppressWarnings("unused")
public class NGECore {
public static boolean didServerCrash = false;
private static NGECore instance;
private Config config = null;
private volatile boolean isShuttingDown = false;
private long galacticTime = System.currentTimeMillis();
private ConcurrentHashMap<IoSession, Client> clients = new ConcurrentHashMap<IoSession, Client>();
// Database
private DatabaseConnection databaseConnection = null;
private DatabaseConnection databaseConnection2 = null;
// Services
public LoginService loginService;
public RetroService retroService;
public ConnectionService connectionService;
public CommandService commandService;
public CharacterService characterService;
public FactionService factionService;
public ObjectService objectService;
public MapService mapService;
public UpdateService updateService;
public TerrainService terrainService;
public SimulationService simulationService;
public ScriptService scriptService;
public ChatService chatService;
public AttributeService attributeService;
public SUIService suiService;
public GuildService guildService;
public GCWService gcwService;
public TradeService tradeService;
public CombatService combatService;
public PlayerService playerService;
public BuffService buffService;
public StaticService staticService;
public GroupService groupService;
public SkillService skillService;
public SkillModService skillModService;
public EquipmentService equipmentService;
public TravelService travelService;
public CollectionService collectionService;
public EntertainmentService entertainmentService;
public WeatherService weatherService;
public SpawnService spawnService;
public AIService aiService;
//public MissionService missionService;
public InstanceService instanceService;
public DevService devService;
public SurveyService surveyService;
public ResourceService resourceService;
public ConversationService conversationService;
public LootService lootService;
// Login Server
public NetworkDispatch loginDispatch;
private MINAServer loginServer;
// Zone Server
public NetworkDispatch zoneDispatch;
private MINAServer zoneServer;
// Interactive Jython Console
public InteractiveJythonAcceptor jythonAcceptor;
private InteractiveJythonServer jythonServer;
private ObjectDatabase creatureODB;
private ObjectDatabase mailODB;
private ObjectDatabase guildODB;
private ObjectDatabase objectIdODB;
private ObjectDatabase duplicateIdODB;
private ObjectDatabase chatRoomODB;
private BusConfiguration eventBusConfig = BusConfiguration.Default(1, new ThreadPoolExecutor(1, 4, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>()));
private ObjectDatabase buildingODB;
private ObjectDatabase resourcesODB;
private ObjectDatabase resourceRootsODB;
private ObjectDatabase resourceHistoryODB;
public static boolean PACKET_DEBUG = false;
public NGECore() {
}
public void start() {
instance = this;
final ThreadMonitor deadlockDetector = new ThreadMonitor();
Thread deadlockMonitor = new Thread(new Runnable() {
@Override
public void run() {
try {
deadlockDetector.findDeadlock();
Thread.sleep(60000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
deadlockMonitor.start();
config = new Config();
config.setFilePath("nge.cfg");
if (!(config.loadConfigFile())) {
config = DefaultConfig.getConfig();
}
// Database
databaseConnection = new DatabaseConnection();
databaseConnection.connect(config.getString("DB.URL"), config.getString("DB.NAME"), config.getString("DB.USER"), config.getString("DB.PASS"), "postgresql");
String db2Url = config.getString("DB2.URL");
if (db2Url == null || db2Url.matches("^\\s*$")) {
databaseConnection2 = null;
} else {
databaseConnection2 = new DatabaseConnection();
databaseConnection2.connect(config.getString("DB2.URL"), config.getString("DB2.NAME"), config.getString("DB2.USER"), config.getString("DB2.PASS"), "mysql");
}
setGalaxyStatus(1);
creatureODB = new ObjectDatabase("creature", true, false, true);
buildingODB = new ObjectDatabase("building", true, false, true);
mailODB = new ObjectDatabase("mails", true, false, true);
guildODB = new ObjectDatabase("guild", true, false, true);
objectIdODB = new ObjectDatabase("oids", true, false, false);
duplicateIdODB = new ObjectDatabase("doids", true, false, true);
chatRoomODB = new ObjectDatabase("chatRooms", true, false, true);
resourcesODB = new ObjectDatabase("resources", true, false, true);
resourceRootsODB = new ObjectDatabase("resourceroots", true, false, true);
resourceHistoryODB = new ObjectDatabase("resourcehistory", true, false, true);
// Services
loginService = new LoginService(this);
retroService = new RetroService(this);
connectionService = new ConnectionService(this);
characterService = new CharacterService(this);
mapService = new MapService(this);
travelService = new TravelService(this);
factionService = new FactionService(this);
objectService = new ObjectService(this);
terrainService = new TerrainService(this);
updateService = new UpdateService(this);
scriptService = new ScriptService(this);
commandService = new CommandService(this);
chatService = new ChatService(this);
attributeService = new AttributeService(this);
suiService = new SUIService(this);
combatService = new CombatService(this);
playerService = new PlayerService(this);
buffService = new BuffService(this);
groupService = new GroupService(this);
skillService = new SkillService(this);
skillModService = new SkillModService(this);
equipmentService = new EquipmentService(this);
entertainmentService = new EntertainmentService(this);
devService = new DevService(this);
conversationService = new ConversationService(this);
lootService = new LootService(this);
if (config.keyExists("JYTHONCONSOLE.PORT")) {
int jythonPort = config.getInt("JYTHONCONSOLE.PORT");
if (jythonPort > 0) {
System.out.println("Starting InteractiveJythonServer on Port " + jythonPort);
jythonAcceptor = new InteractiveJythonAcceptor();
jythonServer = new InteractiveJythonServer((IoHandler) jythonAcceptor, jythonPort, this);
jythonAcceptor.setServer(jythonServer);
jythonServer.start();
}
}
spawnService = new SpawnService(this);
aiService = new AIService(this);
//missionService = new MissionService(this);
if (config.getInt("LOAD.RESOURCE.SYSTEM") == 1) {
surveyService = new SurveyService(this);
resourceService = new ResourceService(this);
}
// Ping Server
try {
PingServer pingServer = new PingServer(config.getInt("PING.PORT"));
pingServer.bind();
} catch (IOException e) {
e.printStackTrace();
}
// Login Server
loginDispatch = new NetworkDispatch(this, false);
loginDispatch.addService(loginService);
loginServer = new MINAServer(loginDispatch, config.getInt("LOGIN.PORT"));
loginServer.start();
// Zone Server
zoneDispatch = new NetworkDispatch(this, true);
zoneDispatch.addService(retroService);
zoneDispatch.addService(connectionService);
zoneDispatch.addService(characterService);
zoneDispatch.addService(factionService);
zoneDispatch.addService(objectService);
zoneDispatch.addService(commandService);
zoneDispatch.addService(chatService);
zoneDispatch.addService(suiService);
zoneDispatch.addService(mapService);
zoneDispatch.addService(travelService);
zoneDispatch.addService(playerService);
zoneDispatch.addService(buffService);
zoneDispatch.addService(entertainmentService);
//zoneDispatch.addService(missionService);
zoneServer = new MINAServer(zoneDispatch, config.getInt("ZONE.PORT"));
zoneServer.start();
staticService = new StaticService(this);
//Start terrainList
// Original Planets
terrainService.addPlanet(1, "tatooine", "terrain/tatooine.trn", true);
terrainService.addPlanet(2, "naboo", "terrain/naboo.trn", true);
terrainService.addPlanet(3, "corellia", "terrain/corellia.trn", true);
terrainService.addPlanet(4, "rori", "terrain/rori.trn", true);
terrainService.addPlanet(5, "lok", "terrain/lok.trn", true);
terrainService.addPlanet(6, "dantooine", "terrain/dantooine.trn", true);
terrainService.addPlanet(7, "talus", "terrain/talus.trn", true);
terrainService.addPlanet(8, "yavin4", "terrain/yavin4.trn", true);
terrainService.addPlanet(9, "endor", "terrain/endor.trn", true);
terrainService.addPlanet(10, "dathomir", "terrain/dathomir.trn", true);
terrainService.addPlanet(11, "mustafar", "terrain/mustafar.trn", true);
terrainService.addPlanet(12, "kashyyyk_main", "terrain/kashyyyk_main.trn", true);
//Dungeon Terrains
// TODO: Fix BufferUnderFlow Errors on loaded of dungeon instances.
/*terrainService.addPlanet(13, "kashyyyk_dead_forest", "terrain/kashyyyk_dead_forest.trn", true);
terrainService.addPlanet(14, "kashyyyk_hunting", "terrain/kashyyyk_hunting.trn", true);
terrainService.addPlanet(15, "kashyyyk_north_dungeons", "terrain/kashyyyk_north_dungeons.trn", true);
terrainService.addPlanet(16, "kashyyyk_rryatt_trail", "terrain/kashyyyk_rryatt_trail.trn", true);
terrainService.addPlanet(17, "kashyyyk_south_dungeons", "terrain/kashyyyk_south_dungeons.trn", true);*/
terrainService.addPlanet(18, "adventure1", "terrain/adventure1.trn", true);
terrainService.addPlanet(19, "adventure2", "terrain/adventure2.trn", true);
terrainService.addPlanet(20, "dungeon1", "terrain/dungeon1.trn", true);
//Space Zones
// NOTE: Commented out for now until space is implemented. No need to be loaded into memory when space is not implemented.
/*terrainService.addPlanet(21, "space_corellia", "terrain/space_corellia.trn", true);
terrainService.addPlanet(22, "space_corellia_2", "terrain/space_corellia_2.trn", true);
terrainService.addPlanet(23, "space_dantooine", "terrain/space_dantooine.trn", true);
terrainService.addPlanet(24, "space_dathomir", "terrain/space_dathomir.trn", true);
terrainService.addPlanet(25, "space_endor", "terrain/space_endor.trn", true);
terrainService.addPlanet(26, "space_env", "terrain/space_env.trn", true);
terrainService.addPlanet(27, "space_halos", "terrain/space_halos.trn", true);
terrainService.addPlanet(28, "space_heavy1", "terrain/space_heavy1.trn", true);
terrainService.addPlanet(29, "space_kashyyyk", "terrain/space_kashyyyk.trn", true);
terrainService.addPlanet(30, "space_light1", "terrain/space_light1.trn", true);
terrainService.addPlanet(31, "space_lok", "terrain/space_lok.trn", true);
terrainService.addPlanet(32, "space_naboo", "terrain/space_naboo.trn", true);
terrainService.addPlanet(33, "space_naboo_2", "terrain/space_naboo_2.trn", true);
terrainService.addPlanet(34, "space_nova_orion", "terrain/space_nova_orion.trn", true);
terrainService.addPlanet(35, "space_npe_falcon", "terrain/space_npe_falcon.trn", true); // TODO: New Player Tutorial
terrainService.addPlanet(36, "space_npe_falcon_2", "terrain/space_npe_falcon_2.trn", true); // TODO: New Player Tutorial
terrainService.addPlanet(37, "space_ord_mantell", "terrain/space_ord_mantell.trn", true);
terrainService.addPlanet(38, "space_ord_mantell_2", "terrain/space_ord_mantell_2.trn", true);
terrainService.addPlanet(39, "space_ord_mantell_3", "terrain/space_ord_mantell_3.trn", true);
terrainService.addPlanet(40, "space_ord_mantell_4", "terrain/space_ord_mantell_4.trn", true);
terrainService.addPlanet(41, "space_ord_mantell_5", "terrain/space_ord_mantell_5.trn", true);
terrainService.addPlanet(42, "space_ord_mantell_6", "terrain/space_ord_mantell_6.trn", true);
terrainService.addPlanet(43, "space_tatooine", "terrain/space_tatooine.trn", true);
terrainService.addPlanet(44, "space_tatooine_2", "terrain/space_tatooine_2.trn", true);
terrainService.addPlanet(45, "space_yavin4", "terrain/space_yavin4.trn", true);*/
//PSWG New Content Terrains (WARNING Keep commented out unless you have the current build of kaas!)
//terrainService.addPlanet(46, "kaas", "terrain/kaas.trn", true);
//end terrainList
spawnService = new SpawnService(this);
terrainService.loadClientPois();
// Travel Points
travelService.loadTravelPoints();
simulationService = new SimulationService(this);
objectService.loadBuildings();
if (config.getInt("LOAD.RESOURCE.SYSTEM") == 1) {
objectService.loadResourceRoots();
objectService.loadResources();
}
terrainService.loadSnapShotObjects();
objectService.loadServerTemplates();
simulationService.insertSnapShotObjects();
simulationService.insertPersistentBuildings();
// Zone services that need to be loaded after the above
zoneDispatch.addService(simulationService);
// Static Spawns
staticService.spawnStatics();
guildService = new GuildService(this);
zoneDispatch.addService(guildService);
gcwService = new GCWService(this);
zoneDispatch.addService(gcwService);
collectionService = new CollectionService(this);
zoneDispatch.addService(collectionService);
tradeService = new TradeService(this);
zoneDispatch.addService(tradeService);
zoneDispatch.addService(skillService);
instanceService = new InstanceService(this);
zoneDispatch.addService(instanceService);
//travelService.startShuttleSchedule();
weatherService = new WeatherService(this);
weatherService.loadPlanetSettings();
spawnService.loadMobileTemplates();
spawnService.loadLairTemplates();
spawnService.loadLairGroups();
spawnService.loadSpawnAreas();
equipmentService.loadBonusSets();
retroService.run();
didServerCrash = false;
System.out.println("Started Server.");
cleanupCreatureODB();
setGalaxyStatus(2);
}
private void cleanupCreatureODB() {
EntityCursor<CreatureObject> cursor = creatureODB.getCursor(Long.class, CreatureObject.class);
Iterator<CreatureObject> it = cursor.iterator();
List<CreatureObject> deletedObjects = new ArrayList<CreatureObject>();
while(it.hasNext()) {
CreatureObject creature = it.next();
if(!characterService.playerExists(creature.getObjectID()))
deletedObjects.add(creature);
}
cursor.close();
Transaction txn = creatureODB.getEnvironment().beginTransaction(null, null);
for(CreatureObject creature : deletedObjects) {
creatureODB.delete(creature.getObjectID(), Long.class, CreatureObject.class, txn);
}
txn.commitSync();
System.out.println("Deleted " + deletedObjects.size() + " creatures.");
}
public void stop() {
System.out.println("Stopping Servers and Connections.");
databaseConnection.close();
databaseConnection2.close();
}
public void cleanUp() {
System.out.println("Cleaning Up...");
long memoryUsed = Runtime.getRuntime().freeMemory();
System.out.println("Using " + memoryUsed + " bytes of memory.");
config = null;
databaseConnection = null;
databaseConnection2 = null;
Runtime.getRuntime().gc();
System.out.println("Cleaned Up " + (Runtime.getRuntime().freeMemory() - memoryUsed) + " bytes of memory.");
}
public void restart() {
stop();
cleanUp();
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
}
start();
}
public static void main(String[] args) {
NGECore core = new NGECore();
core.start();
do {
if (didServerCrash) {
core.restart();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
} while (true);
}
public void setGalaxyStatus(int statusId) {
int galaxyId = config.getInt("GALAXY_ID");
try {
PreparedStatement ps = databaseConnection.preparedStatement("UPDATE \"connectionServers\" SET \"statusId\"=? WHERE \"galaxyId\"=?");
ps.setInt(1, statusId);
ps.setInt(2, galaxyId);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
/*
* ---------- Getter methods for NGECore ----------
*/
public Config getConfig() {
return config;
}
public String getGalaxyName() {
return config.getString("GALAXY_NAME");
}
public DatabaseConnection getDatabase1() {
return databaseConnection;
}
public DatabaseConnection getDatabase2() {
return databaseConnection2;
}
public ObjectDatabase getCreatureODB() {
return creatureODB;
}
public ObjectDatabase getMailODB() {
return mailODB;
}
public ObjectDatabase getGuildODB() {
return guildODB;
}
public ObjectDatabase getBuildingODB() {
return buildingODB;
}
public ObjectDatabase getObjectIdODB() {
return objectIdODB;
}
public ObjectDatabase getDuplicateIdODB() {
return duplicateIdODB;
}
public ObjectDatabase getChatRoomODB() {
return chatRoomODB;
}
public ObjectDatabase getResourcesODB() {
return resourcesODB;
}
public ObjectDatabase getResourceRootsODB() {
return resourceRootsODB;
}
public ObjectDatabase getResourceHistoryODB() {
return resourceHistoryODB;
}
public int getActiveClients() {
int connections = 0;
for (Map.Entry<IoSession, Client> c : clients.entrySet()) {
if(c.getValue().getSession() != null) {
if (c.getValue().getSession().isConnected()) {
connections++;
}
}
}
return connections;
}
public int getActiveZoneClients() {
int connections = 0;
for (Map.Entry<IoSession, Client> c : clients.entrySet()) {
if(c.getValue().getSession() != null) {
if (c.getValue().getSession().isConnected() && c.getValue().getParent() != null) {
connections++;
}
}
}
return connections;
}
public Client getClient(IoSession session) {
return clients.get(session);
}
public ConcurrentHashMap<IoSession, Client> getActiveConnectionsMap() {
return clients;
}
/*
* --------------- Other methods for services ---------------
*/
public void addClient(IoSession session, Client client) {
clients.put(session, client);
}
public void removeClient(IoSession session) {
clients.remove(session);
}
// for python scripts
public Thread getCurrentThread() {
return Thread.currentThread();
}
public static NGECore getInstance() {
return instance;
}
public BusConfiguration getEventBusConfig() {
return eventBusConfig;
}
public void initiateShutdown() {
if(isShuttingDown)
return;
try {
for(int minutes = 15; minutes > 1; minutes--) {
simulationService.notifyAllClients(new ChatSystemMessage("The server will be shutting down soon. Please find a safe place to logout. (" + minutes + " minutes left)", (byte) 0 ).serialize());
Thread.sleep(60000);
}
setGalaxyStatus(3);
simulationService.notifyAllClients(new ChatSystemMessage("The server will be shutting down soon. Please find a safe place to logout. (" + 1 + " minutes left)", (byte) 0 ).serialize());
Thread.sleep(30000);
simulationService.notifyAllClients(new ChatSystemMessage("You will be disconnected in 30 seconds so the server can perform a final save before shutting down. Please find a safe place to logout now.", (byte) 0 ).serialize());
Thread.sleep(20000);
simulationService.notifyAllClients(new ChatSystemMessage("You will be disconnected in 10 seconds so the server can perform a final save before shutting down. Please find a safe place to logout now.", (byte) 0 ).serialize());
Thread.sleep(10000);
simulationService.notifyAllClients(new ChatSystemMessage("You will now be disconnected so the server can perform a final save before shutting down.", (byte) 0 ).serialize());
synchronized(getActiveConnectionsMap()) {
for(Client client : getActiveConnectionsMap().values()) {
client.getSession().close(true);
connectionService.disconnect(client);
}
}
System.exit(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public long getGalacticTime() {
return System.currentTimeMillis() - galacticTime;
}
}
@@ -99,7 +99,7 @@ public class CharacterSheetResponseMessage extends SWGMessage {
buffer.put(getUnicodeString(spouse));
buffer.putInt(10); // lots remaining
buffer.putInt(creature.getPlayerObject().getLotsRemaining()); // lots remaining
return buffer.flip();
}
+29
View File
@@ -23,11 +23,23 @@ package protocol.swg;
import org.apache.mina.core.buffer.IoBuffer;
public class ChatCreateRoom extends SWGMessage {
private String address, title;
private boolean privacy, moderatorOnly;
private int request;
public ChatCreateRoom() { }
@Override
public void deserialize(IoBuffer data) {
this.privacy = (boolean) ((data.get() == 1) ? false : true);
this.moderatorOnly = (boolean) ((data.get() == 1) ? true : false);
data.getShort(); // unk
this.address = getAsciiString(data);
this.title = getAsciiString(data);
this.request = data.getInt();
}
@Override
@@ -35,4 +47,21 @@ public class ChatCreateRoom extends SWGMessage {
return null;
}
public String getAddress() {
return address;
}
public String getTitle() {
return title;
}
public boolean isPrivacy() {
return privacy;
}
public boolean isModeratorOnly() {
return moderatorOnly;
}
public int getRequest() {
return request;
}
}
+14 -5
View File
@@ -23,15 +23,24 @@ package protocol.swg;
import org.apache.mina.core.buffer.IoBuffer;
import resources.common.StringUtilities;
public class ChatEnterRoomById extends SWGMessage {
private int roomId;
private int requestId;
public ChatEnterRoomById() { }
@Override
public void deserialize(IoBuffer data) {
setRoomId(data.getInt());
StringUtilities.printBytes(data.array());
data.getShort();
data.getInt();
this.requestId = data.getInt();
this.roomId = data.getInt();
// getAsciiString(data); // name of the room but don't need it since we have id.
}
@Override
@@ -39,12 +48,12 @@ public class ChatEnterRoomById extends SWGMessage {
return null;
}
public int getRequestId() {
return requestId;
}
public int getRoomId() {
return roomId;
}
public void setRoomId(int roomId) {
this.roomId = roomId;
}
}
+49 -3
View File
@@ -21,6 +21,10 @@
******************************************************************************/
package protocol.swg;
import java.nio.ByteOrder;
import main.NGECore;
import org.apache.mina.core.buffer.IoBuffer;
import services.chat.ChatRoom;
@@ -28,9 +32,13 @@ import services.chat.ChatRoom;
public class ChatOnCreateRoom extends SWGMessage {
private ChatRoom room;
private int error;
private int requestId;
public ChatOnCreateRoom(ChatRoom room) {
public ChatOnCreateRoom(ChatRoom room, int error, int requestId) {
this.room = room;
this.error = error;
this.requestId = requestId;
}
@Override
@@ -40,8 +48,46 @@ public class ChatOnCreateRoom extends SWGMessage {
@Override
public IoBuffer serialize() {
// TODO Auto-generated method stub
return null;
String server = NGECore.getInstance().getGalaxyName();
IoBuffer data = IoBuffer.allocate(100).order(ByteOrder.LITTLE_ENDIAN);
data.setAutoExpand(true);
data.putShort((short) 4);
data.putInt(0x35D7CC9F);
data.putInt(error);
data.putInt(room.getRoomId());
data.putInt(room.isPrivateRoom() ? 0 : 1);
data.put((byte) (room.isModeratorsOnly() ? 1 : 0));
data.put(getAsciiString(room.getRoomAddress()));
data.put(getAsciiString("SWG"));
data.put(getAsciiString(server));
data.put(getAsciiString(room.getCreator()));
data.put(getAsciiString("SWG"));
data.put(getAsciiString(server));
data.put(getAsciiString(room.getOwner()));
data.put(getUnicodeString(room.getDescription()));
data.putInt(0);
/*if (room.getModeratorList().size() > 0) {
for (CreatureObject creo : room.getModeratorList()) {
data.put(getAsciiString("SWG"));
data.put(getAsciiString(server));
data.put(getAsciiString(creo.getCustomName()));
}
}*/
data.putInt(0);
/*if (room.getUserList().size() > 0) {
for (CreatureObject creo : room.getUserList()) {
data.put(getAsciiString("SWG"));
data.put(getAsciiString(server));
data.put(getAsciiString(creo.getCustomName()));
}
}*/
data.putInt(requestId);
return data.flip();
}
}
+1
View File
@@ -62,6 +62,7 @@ public class ChatOnEnteredRoom extends SWGMessage {
buffer.put(getAsciiString(characterName));
buffer.putInt(success);
buffer.putInt(roomId);
buffer.putInt(0);
return buffer.flip();
}
@@ -0,0 +1,64 @@
/*******************************************************************************
* Copyright (c) 2013 <Project SWG>
*
* This File is part of NGECore2.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Using NGEngine to work with NGECore2 is making a combined work based on NGEngine.
* Therefore all terms and conditions of the GNU Lesser General Public License cover the combination.
******************************************************************************/
package protocol.swg;
import java.nio.ByteOrder;
import main.NGECore;
import org.apache.mina.core.buffer.IoBuffer;
import services.travel.TravelPoint;
import engine.resources.objects.SWGObject;
@SuppressWarnings("unused")
public class EnterStructurePlacementModeMessage extends SWGMessage {
private SWGObject deed;
private String structureTemplate;
public EnterStructurePlacementModeMessage(SWGObject deed, String structureTemplate) {
this.deed = deed;
this.structureTemplate = structureTemplate;
}
@Override
public void deserialize(IoBuffer data) {
}
@Override
public IoBuffer serialize() {
IoBuffer result = IoBuffer.allocate(16 + structureTemplate.length()).order(ByteOrder.LITTLE_ENDIAN);
result.putShort((short) 3);
result.putInt(0xE8A54DC1);
result.putLong(deed.getObjectID());
deed.setAttachment("structureTemplate", structureTemplate);
result.put(getAsciiString(structureTemplate));
return result.flip();
}
}
@@ -22,7 +22,6 @@
package resources.objects.creature;
import java.lang.System;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
@@ -63,6 +62,7 @@ import engine.resources.objects.SWGObject;
import engine.resources.scene.Planet;
import engine.resources.scene.Point3D;
import engine.resources.scene.Quaternion;
import resources.objects.player.PlayerObject;
import resources.objects.tangible.TangibleObject;
import resources.objects.weapon.WeaponObject;
@@ -1777,6 +1777,11 @@ public class CreatureObject extends TangibleObject implements IPersistent {
return 0L;
}
public PlayerObject getPlayerObject()
{
return (PlayerObject) this.getSlottedObject("ghost");
}
//public float getCooldown(String cooldownGroup) {
//return ((float) getCooldown(cooldownGroup) / (float) 1000);
//}
+29 -1
View File
@@ -45,7 +45,7 @@ import engine.resources.scene.Planet;
import engine.resources.scene.Point3D;
import engine.resources.scene.Quaternion;
@Persistent(version=9)
@Persistent(version=10)
public class PlayerObject extends IntangibleObject {
// PLAY 3
@@ -127,6 +127,8 @@ public class PlayerObject extends IntangibleObject {
private String holoEmote;
private int holoEmoteUses;
private int lotsRemaining = 10;
@NotPersistent
private PlayerMessageBuilder messageBuilder;
@@ -822,4 +824,30 @@ public class PlayerObject extends IntangibleObject {
public void setRecentContainer(ResourceContainerObject recentContainer) {
this.recentContainer = recentContainer;
}
public void setLotsRemaining(int amount)
{
this.lotsRemaining = amount;
}
public boolean addLots(int amount)
{
this.lotsRemaining += amount;
return true;
}
public boolean deductLots(int amount)
{
if(this.lotsRemaining - amount > 0)
{
this.lotsRemaining -= amount;
return true;
}
return false;
}
public int getLotsRemaining()
{
return this.lotsRemaining;
}
}
File diff suppressed because it is too large Load Diff
+5
View File
@@ -909,6 +909,11 @@ public class SimulationService implements INetworkDispatch {
if(obj1.getPlanet() != obj2.getPlanet())
return false;
// If obj1 is container of obj2 vice versa
if (obj1 == obj2.getContainer() || obj2 == obj1.getContainer() || obj1 == obj2.getGrandparent() || obj2 == obj1.getGrandparent()) {
return true;
}
if(obj1.getGrandparent() != null || obj2.getGrandparent() != null) {
if(obj1.getGrandparent() == obj2.getGrandparent())
+38 -8
View File
@@ -49,6 +49,7 @@ import resources.common.*;
import resources.objects.creature.CreatureObject;
import resources.objects.player.PlayerObject;
import protocol.swg.AddIgnoreMessage;
import protocol.swg.ChatCreateRoom;
import protocol.swg.ChatEnterRoomById;
import protocol.swg.ChatOnChangeFriendStatus;
import protocol.swg.ChatDeletePersistentMessage;
@@ -56,6 +57,7 @@ import protocol.swg.ChatFriendsListUpdate;
import protocol.swg.ChatInstantMessageToCharacter;
import protocol.swg.ChatInstantMessagetoClient;
import protocol.swg.ChatOnAddFriend;
import protocol.swg.ChatOnCreateRoom;
import protocol.swg.ChatOnEnteredRoom;
import protocol.swg.ChatOnSendInstantMessage;
import protocol.swg.ChatOnSendPersistentMessage;
@@ -369,13 +371,37 @@ public class ChatService implements INetworkDispatch {
});
swgOpcodes.put(Opcodes.ChatCreateRoom, (session, data) -> {
//System.out.println("CREATE:");
//StringUtilities.printBytes(data.array());
data.order(ByteOrder.LITTLE_ENDIAN);
Client client = core.getClient(session);
if(client == null)
return;
SWGObject obj = client.getParent();
if (obj == null)
return;
CreatureObject creo = (CreatureObject) obj;
ChatCreateRoom sentPacket = new ChatCreateRoom();
sentPacket.deserialize(data);
ChatRoom room = createChatRoom(sentPacket.getTitle(), sentPacket.getAddress(), creo.getCustomName().toLowerCase(), true, false);
room.setPrivateRoom(sentPacket.isPrivacy());
room.setModeratorsOnly(sentPacket.isModeratorOnly());
if (room != null) {
room.getUserList().add(creo);
room.getModeratorList().add(creo);
ChatOnCreateRoom response = new ChatOnCreateRoom(room, 0, sentPacket.getRequest());
session.write(response.serialize());
}
});
swgOpcodes.put(Opcodes.ChatQueryRoom, (session, data) -> {
//System.out.println("QUERY: ");
//StringUtilities.printBytes(data.array());
});
swgOpcodes.put(Opcodes.ChatSendToRoom, (session, data) -> {
@@ -408,13 +434,14 @@ public class ChatService implements INetworkDispatch {
if (obj == null)
return;
data.order(ByteOrder.LITTLE_ENDIAN);
data.position(0);
ChatEnterRoomById sentPacket = new ChatEnterRoomById();
sentPacket.deserialize(data);
joinChatRoom((CreatureObject) obj, sentPacket.getRoomId());
//System.out.println("Entering room...");
System.out.println("Entering room... " + sentPacket.getRoomId());
});
}
@@ -684,7 +711,7 @@ public class ChatService implements INetworkDispatch {
}
private void loadChatRooms() {
ChatRoom system = createChatRoom("Waves Dungeon", "ProjectSWGTest.Dungeon", "Waverunner", true);
ChatRoom system = createChatRoom("", "Chat", "system", true);
chatRooms.put(system.getRoomId(), system);
EntityCursor<ChatRoom> cursor = chatRoomsODB.getCursor(Integer.class, ChatRoom.class);
@@ -704,7 +731,10 @@ public class ChatService implements INetworkDispatch {
ChatRoom room = new ChatRoom();
room.setDescription(roomName);
room.setRoomAddress("SWG." + core.getGalaxyName() + "." + address);
if (!address.startsWith("SWG."))
room.setRoomAddress("SWG." + core.getGalaxyName() + "." + address);
else
room.setRoomAddress(address);
room.setCreator(creator);
room.setOwner(creator);
room.setVisible(showInList);
+19 -12
View File
@@ -118,7 +118,11 @@ public class CommandService implements INetworkDispatch {
return false;
}
if (target != null && actor.getPosition().getDistance(target.getPosition()) > command.getMaxRangeToTarget()) {
if (target.getContainer() == actor || target.getGrandparent() == actor) {
break;
}
if (command.getMaxRangeToTarget() != 0 && actor.getPosition().getDistance(target.getPosition()) > command.getMaxRangeToTarget()) {
return false;
}
@@ -272,7 +276,7 @@ public class CommandService implements INetworkDispatch {
boolean hasCharacterAbility = (((String) visitor.getObject(i, 7-sub)).length() > 0);
if (tableArray[n].startsWith("client_") && tableArray[n].startsWith("command_table_")) {
if (tableArray[n].startsWith("client_") || tableArray[n].startsWith("command_table_")) {
sub += 7;
}
@@ -282,8 +286,11 @@ public class CommandService implements INetworkDispatch {
boolean isCombatCommand = false;
if(visitor.getObject(i, 82-sub) instanceof Boolean)
isCombatCommand = (Boolean) visitor.getObject(i, 82-sub);
System.out.println(((String) visitor.getObject(i, 85-sub)));
if(((String) visitor.getObject(i, 3)).equals("failSpecialAttack") || ((String) visitor.getObject(i, 85-sub)).equals("defaultattack"))
isCombatCommand = true;
if (hasCharacterAbility || isCombatCommand) {
CombatCommand command = new CombatCommand(name.toLowerCase());
@@ -333,7 +340,7 @@ public class CommandService implements INetworkDispatch {
boolean hasCharacterAbility = (((String) visitor.getObject(i, 7-sub)).length() > 0);
if (tableArray[n].startsWith("client_") && tableArray[n].startsWith("command_table_")) {
if (tableArray[n].startsWith("client_") || tableArray[n].startsWith("command_table_")) {
sub += 7;
}
@@ -343,9 +350,10 @@ public class CommandService implements INetworkDispatch {
boolean isCombatCommand = false;
if(visitor.getObject(i, 82-sub) instanceof Boolean)
isCombatCommand = (Boolean) visitor.getObject(i, 82-sub);
if(((String) visitor.getObject(i, 3)).equals("failSpecialAttack") || ((String) visitor.getObject(i, 85-sub)).equals("defaultattack"))
isCombatCommand = true;
// "isCombatCommand" needs to be changed so that non-combat commands that are flagged to added to a combat queue are not considered combat commands
if (hasCharacterAbility || isCombatCommand) {
CombatCommand command = new CombatCommand(commandName);
commandLookup.add(command);
@@ -367,10 +375,7 @@ public class CommandService implements INetworkDispatch {
}
public void processCommand(CreatureObject actor, SWGObject target, BaseSWGCommand command, int actionCounter, String commandArgs) {
if (command.getCooldown() > (float) 1) {
actor.addCooldown(command.getCooldownGroup(), command.getCooldown());
}
actor.addCooldown(command.getCooldownGroup(), command.getCooldown());
if (command instanceof CombatCommand) {
processCombatCommand(actor, target, (CombatCommand) command, actionCounter, commandArgs);
} else {
@@ -391,7 +396,9 @@ public class CommandService implements INetworkDispatch {
//}
if(FileUtilities.doesFileExist("scripts/commands/combat/" + command.getCommandName() + ".py"))
{
core.scriptService.callScript("scripts/commands/combat/", command.getCommandName(), "setup", core, attacker, target, command);
}
boolean success = true;
@@ -476,7 +483,7 @@ public class CommandService implements INetworkDispatch {
return;
}
if(command.getHitType() == 0 && command.getBuffNameSelf().length() > 0) {
if(command.getHitType() == 0 && command.getBuffNameSelf() != null && command.getBuffNameSelf().length() > 0) {
core.combatService.doSelfBuff(attacker, weapon, command, actionCounter);
return;
}
+70
View File
@@ -0,0 +1,70 @@
package services.housing;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
import engine.resources.scene.Point3D;
public class HouseTemplate
{
private String deedTemplate;
private String buildingTemplate;
private int lotCost;
private int defaultItemLimit;
private Vector<String> placeablePlanets;
private Map<String, Point3D> buildingSigns;
public HouseTemplate(String deedTemplate, String buildingTemplate, int lotCost)
{
this.deedTemplate = deedTemplate;
this.buildingTemplate = buildingTemplate;
this.lotCost = lotCost;
this.defaultItemLimit = 50;
this.placeablePlanets = new Vector<String>();
this.buildingSigns = new HashMap<String, Point3D>();
}
public void addBuildingSign(String signTemplate, Point3D signPosition)
{
buildingSigns.put(signTemplate, signPosition);
}
public void addPlaceablePlanet(String planetName)
{
this.placeablePlanets.add(planetName);
}
public void setDefaultItemLimit(int itemLimit)
{
this.defaultItemLimit = itemLimit;
}
public String getDeedTemplate()
{
return this.deedTemplate;
}
public String getBuildingTemplate()
{
return this.buildingTemplate;
}
public Map<String, Point3D> getBuildingSigns()
{
return this.buildingSigns;
}
public Vector<String> getPlaceablePlanets()
{
return this.placeablePlanets;
}
public boolean canBePlacedOn(String planetName)
{
if(placeablePlanets.contains(planetName)) return true;
else return false;
}
public int getLotCost()
{
return this.lotCost;
}
public int getDefaultItemLimit()
{
return this.defaultItemLimit;
}
}
+182
View File
@@ -0,0 +1,182 @@
/*******************************************************************************
* Copyright (c) 2013 <Project SWG>
*
* This File is part of NGECore2.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Using NGEngine to work with NGECore2 is making a combined work based on NGEngine.
* Therefore all terms and conditions of the GNU Lesser General Public License cover the combination.
******************************************************************************/
package services.housing;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Map;
import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap;
import com.sleepycat.persist.EntityCursor;
import main.NGECore;
import protocol.swg.EnterStructurePlacementModeMessage;
import resources.objects.building.BuildingObject;
import resources.objects.creature.CreatureObject;
import resources.objects.player.PlayerObject;
import resources.objects.tangible.TangibleObject;
import services.chat.Mail;
import services.equipment.BonusSetTemplate;
import engine.resources.objects.SWGObject;
import engine.resources.scene.Point3D;
import engine.resources.scene.Quaternion;
import engine.resources.service.INetworkDispatch;
import engine.resources.service.INetworkRemoteEvent;
public class HousingService implements INetworkDispatch {
private NGECore core;
private Map<String, HouseTemplate> housingTemplates = new ConcurrentHashMap<String, HouseTemplate>();
public HousingService(NGECore core) {
this.core = core;
core.commandService.registerCommand("placestructure");
core.commandService.registerCommand("movefurniture");
core.commandService.registerCommand("rotatefurniture");
}
public void enterStructureMode(CreatureObject actor, TangibleObject deed)
{
if(!actor.getClient().isGM() && !core.terrainService.canBuildAtPosition(actor, actor.getWorldPosition().x, actor.getWorldPosition().z))
{
actor.sendSystemMessage("You may not place a structure here.", (byte) 0); // should probably load this from an stf
return;
}
if(housingTemplates.containsKey(deed.getTemplate()))
{
HouseTemplate houseTemplate = housingTemplates.get(deed.getTemplate());
EnterStructurePlacementModeMessage packet = new EnterStructurePlacementModeMessage(deed, houseTemplate.getBuildingTemplate());
actor.getClient().getSession().write(packet.serialize());
}
}
public void placeStructure(final CreatureObject actor, TangibleObject deed, float positionX, float positionZ, float rotation)
{
HouseTemplate houseTemplate = housingTemplates.get(deed.getTemplate());
int structureLotCost = houseTemplate.getLotCost();
String structureTemplate = houseTemplate.getBuildingTemplate();
if(!houseTemplate.canBePlacedOn(actor.getPlanet().getName()))
{
actor.sendSystemMessage("You may not place this structure on this planet.", (byte) 0); // should probably load this from an stf
return;
}
if(!actor.getClient().isGM() && !core.terrainService.canBuildAtPosition(actor, positionX, positionZ))
{
actor.sendSystemMessage("You may not place a structure here.", (byte) 0); // should probably load this from an stf
return;
}
// Lot stuff
if(actor.getPlayerObject().getLotsRemaining() - structureLotCost < 0)
{
actor.sendSystemMessage("You do not have enough available lots to place this structure.", (byte) 0); // should probably load this from an stf
return;
}
actor.getPlayerObject().deductLots(structureLotCost);
// Calculate our orientation and height
Quaternion quaternion = new Quaternion(1, 0, 0, 0);
quaternion = resources.common.MathUtilities.rotateQuaternion(quaternion, (float)((Math.PI/2) * rotation), new Point3D(0, 1, 0));
float positionY = core.terrainService.getHeight(actor.getPlanetId(), positionX, positionZ) + 2f;
// Create the building
BuildingObject building = (BuildingObject) core.objectService.createObject(structureTemplate, 0, actor.getPlanet(), new Point3D(positionX, positionY, positionZ), quaternion);
core.simulationService.add(building, building.getPosition().x, building.getPosition().z, true);
// Name the sign
TangibleObject sign = (TangibleObject) building.getAttachment("structureSign");
String playerFirstName = actor.getCustomName().split(" ")[0];
sign.setCustomName2(playerFirstName + "'s House");
//building.add(sign);
core.objectService.destroyObject(deed);
// Structure management
Vector<Long> admins = new Vector<>();
admins.add(actor.getObjectID());
building.setAttachment("structureOwner", actor.getObjectID());
building.setAttachment("structureAdmins", admins);
// Save structure to DB
//building.createTransaction(core.getBuildingODB().getEnvironment());
//core.getBuildingODB().put(building, Long.class, BuildingObject.class, building.getTransaction());
//building.getTransaction().commitSync();
}
@SuppressWarnings("unchecked")
public boolean getPermissions(SWGObject player, SWGObject container)
{
if(((Vector<Long>) container.getContainer().getAttachment("structureAdmins")).contains(player.getObjectID())) return true;
return false;
}
public void addHousingTemplate(HouseTemplate houseTemplate)
{
housingTemplates.put(houseTemplate.getDeedTemplate(), houseTemplate);
}
public void loadHousingTemplates() {
Path p = Paths.get("scripts/houses/");
FileVisitor<Path> fv = new SimpleFileVisitor<Path>()
{
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException
{
System.out.println("Loading housing template " + file.getFileName());
core.scriptService.callScript("scripts/houses/", file.getFileName().toString().replace(".py", ""), "setup", core);
return FileVisitResult.CONTINUE;
}
};
try
{
Files.walkFileTree(p, fv);
}
catch (IOException e) { e.printStackTrace(); }
}
@Override
public void insertOpcodes(Map<Integer, INetworkRemoteEvent> arg0,
Map<Integer, INetworkRemoteEvent> arg1) {
// TODO Auto-generated method stub
}
@Override
public void shutdown() {
}
}
+6 -6
View File
@@ -877,7 +877,7 @@ public class ObjectService implements INetworkDispatch {
* @param position The position as an offset to the parent object.
* @param orientation The orientation as an offset to the parent object.
*/
public void createChildObject(SWGObject parent, String template, Point3D position, Quaternion orientation, int cellNumber) {
public SWGObject createChildObject(SWGObject parent, String template, Point3D position, Quaternion orientation, int cellNumber) {
if(cellNumber == -1) {
@@ -907,15 +907,15 @@ public class ObjectService implements INetworkDispatch {
child.setAttachment("cellNumber", cellNumber);
//core.simulationService.add(child, x, z);
return child;
}
public void createChildObject(SWGObject parent, String template, float x, float y, float z, float qy, float qw) {
createChildObject(parent, template, new Point3D(x, y, z), new Quaternion(qw, 0, qy, 0), -1);
public SWGObject createChildObject(SWGObject parent, String template, float x, float y, float z, float qy, float qw) {
return createChildObject(parent, template, new Point3D(x, y, z), new Quaternion(qw, 0, qy, 0), -1);
}
public void createChildObject(SWGObject parent, String template, float x, float y, float z, float qy, float qw, int cellNumber) {
createChildObject(parent, template, new Point3D(x, y, z), new Quaternion(qw, 0, qy, 0), cellNumber);
public SWGObject createChildObject(SWGObject parent, String template, float x, float y, float z, float qy, float qw, int cellNumber) {
return createChildObject(parent, template, new Point3D(x, y, z), new Quaternion(qw, 0, qy, 0), cellNumber);
}
public void loadBuildoutObjects(Planet planet) throws InstantiationException, IllegalAccessException {