mirror of
https://github.com/ProjectSWGCore/NGECore2.git
synced 2026-10-13 03:13:26 -04:00
Merge remote-tracking branch 'origin/master' into LootSystem
Conflicts: src/main/NGECore.java src/services/DevService.java
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
//}
|
||||
|
||||
@@ -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
@@ -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())
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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() {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user