mirror of
https://github.com/ProjectSWGCore/Holocore.git
synced 2026-08-27 17:57:53 -04:00
Fixed awareness - I think. Still a crash bug lingering!
This commit is contained in:
@@ -380,6 +380,7 @@ public class CreatureObject extends TangibleObject {
|
||||
}
|
||||
|
||||
public void createObject(Player target) {
|
||||
System.out.println(getName() + " sent to " + target.getCreatureObject().getName());
|
||||
sendSceneCreateObject(target);
|
||||
|
||||
BaselineBuilder bb = null;
|
||||
|
||||
@@ -4,7 +4,6 @@ import intents.GalacticPacketIntent;
|
||||
import intents.swgobject_events.SWGObjectEventIntent;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -71,6 +70,7 @@ public class ObjectManager extends Manager {
|
||||
objects.traverse(new Traverser<SWGObject>() {
|
||||
@Override
|
||||
public void process(SWGObject obj) {
|
||||
obj.setOwner(null);
|
||||
Location l = obj.getLocation();
|
||||
if (l.getTerrain() != null) {
|
||||
QuadTree <SWGObject> tree = quadTree.get(l.getTerrain());
|
||||
@@ -94,6 +94,12 @@ public class ObjectManager extends Manager {
|
||||
|
||||
@Override
|
||||
public boolean terminate() {
|
||||
objects.traverse(new Traverser<SWGObject>() {
|
||||
@Override
|
||||
public void process(SWGObject obj) {
|
||||
obj.setOwner(null);
|
||||
}
|
||||
});
|
||||
objects.save();
|
||||
return super.terminate();
|
||||
}
|
||||
@@ -171,24 +177,29 @@ public class ObjectManager extends Manager {
|
||||
}
|
||||
|
||||
private void moveObject(SWGObject obj, Location oldLocation, Location newLocation) {
|
||||
double x = 0, y = 0;
|
||||
List <Player> updatedAware = new ArrayList<Player>();
|
||||
if (oldLocation != null && oldLocation.getTerrain() != null) { // Remove from QuadTree
|
||||
x = oldLocation.getX();
|
||||
y = oldLocation.getZ();
|
||||
double x = oldLocation.getX();
|
||||
double y = oldLocation.getZ();
|
||||
quadTree.get(oldLocation.getTerrain()).remove(x, y, obj);
|
||||
}
|
||||
if (newLocation != null && newLocation.getTerrain() != null) { // Add to QuadTree, update awareness
|
||||
obj.setLocation(newLocation);
|
||||
x = newLocation.getX();
|
||||
y = newLocation.getZ();
|
||||
QuadTree<SWGObject> tree = quadTree.get(newLocation.getTerrain());
|
||||
for (SWGObject inRange : tree.getWithinRange(x, y, AWARE_RANGE))
|
||||
if (inRange.getOwner() != null && inRange.getObjectId() != obj.getObjectId())
|
||||
updatedAware.add(inRange.getOwner());
|
||||
quadTree.get(newLocation.getTerrain()).put(x, y, obj);
|
||||
updateAwarenessForObject(obj);
|
||||
quadTree.get(newLocation.getTerrain()).put(newLocation.getX(), newLocation.getZ(), obj);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateAwarenessForObject(SWGObject obj) {
|
||||
Location location = obj.getLocation();
|
||||
List <Player> updatedAware = new ArrayList<Player>();
|
||||
double x = location.getX();
|
||||
double y = location.getZ();
|
||||
QuadTree<SWGObject> tree = quadTree.get(location.getTerrain());
|
||||
for (SWGObject inRange : tree.getWithinRange(x, y, AWARE_RANGE)) {
|
||||
if (inRange.getOwner() != null && inRange.getObjectId() != obj.getObjectId()) {
|
||||
updatedAware.add(inRange.getOwner());
|
||||
}
|
||||
}
|
||||
System.out.println(obj.getName() + " - " + Arrays.toString(updatedAware.toArray()));
|
||||
obj.updateAwareness(updatedAware);
|
||||
obj.sendDataTransforms();
|
||||
}
|
||||
@@ -240,6 +251,9 @@ public class ObjectManager extends Manager {
|
||||
CreatureObject creature = (CreatureObject) player.getCreatureObject();
|
||||
player.sendPacket(new UpdatePvpStatusMessage(creature.getPvpType(), creature.getPvpFactionId(), creature.getObjectId()));
|
||||
creature.createObject(player);
|
||||
creature.clearAware();
|
||||
moveObject(creature, creature.getLocation(), creature.getLocation());
|
||||
updateAwarenessForObject(creature);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,6 +266,7 @@ public class ObjectManager extends Manager {
|
||||
throw new NullPointerException("CreatureObject for ID: " + characterId + " cannot be null!");
|
||||
}
|
||||
player.setCreatureObject(creature); // CreatureObject contains the player object!
|
||||
creature.setOwner(player);
|
||||
|
||||
if (player.getPlayerObject() == null) {
|
||||
System.err.println("FATAL: " + player.getUsername() + "'s CreatureObject has a null ghost!");
|
||||
|
||||
@@ -3,6 +3,8 @@ package services.player;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import network.packets.Packet;
|
||||
import network.packets.swg.login.ClientIdMsg;
|
||||
@@ -11,21 +13,18 @@ import resources.control.Intent;
|
||||
import resources.control.Manager;
|
||||
import resources.network.ServerType;
|
||||
import resources.player.Player;
|
||||
import resources.server_info.ObjectDatabase;
|
||||
import resources.server_info.ObjectDatabase.Traverser;
|
||||
|
||||
public class PlayerManager extends Manager {
|
||||
|
||||
private LoginService loginService;
|
||||
private ZoneService zoneService;
|
||||
|
||||
private ObjectDatabase <Player> players;
|
||||
private final Map <Long, Player> players;
|
||||
private final LoginService loginService;
|
||||
private final ZoneService zoneService;
|
||||
|
||||
public PlayerManager() {
|
||||
loginService = new LoginService();
|
||||
zoneService = new ZoneService();
|
||||
|
||||
players = new ObjectDatabase<Player>("odb/players.db");
|
||||
players = new HashMap<Long, Player>();
|
||||
|
||||
addChildService(loginService);
|
||||
addChildService(zoneService);
|
||||
@@ -34,19 +33,11 @@ public class PlayerManager extends Manager {
|
||||
@Override
|
||||
public boolean initialize() {
|
||||
registerForIntent(GalacticPacketIntent.TYPE);
|
||||
players.loadToCache();
|
||||
players.traverse(new Traverser<Player>() {
|
||||
@Override
|
||||
public void process(Player p) {
|
||||
p.setPlayerManager(PlayerManager.this);
|
||||
}
|
||||
});
|
||||
return super.initialize();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean terminate() {
|
||||
players.save();
|
||||
return super.terminate();
|
||||
}
|
||||
|
||||
@@ -59,8 +50,9 @@ public class PlayerManager extends Manager {
|
||||
long networkId = gpi.getNetworkId();
|
||||
Player player = null;
|
||||
if (type == ServerType.ZONE && packet instanceof ClientIdMsg)
|
||||
transitionLoginToZone(networkId, gpi.getGalaxy().getId(), (ClientIdMsg) packet);
|
||||
player = players.get(networkId);
|
||||
player = transitionLoginToZone(networkId, gpi.getGalaxy().getId(), (ClientIdMsg) packet);
|
||||
else
|
||||
player = players.get(networkId);
|
||||
if (player == null && type == ServerType.LOGIN) {
|
||||
player = new Player(this, networkId);
|
||||
players.put(networkId, player);
|
||||
@@ -89,14 +81,13 @@ public class PlayerManager extends Manager {
|
||||
return false;
|
||||
}
|
||||
|
||||
private void transitionLoginToZone(final long networkId, final int galaxyId, ClientIdMsg clientId) {
|
||||
private Player transitionLoginToZone(final long networkId, final int galaxyId, ClientIdMsg clientId) {
|
||||
final byte [] nToken = clientId.getSessionToken();
|
||||
players.traverse(new Traverser<Player>() {
|
||||
@Override
|
||||
public void process(Player p) {
|
||||
synchronized (players) {
|
||||
for (Player p : players.values()) {
|
||||
byte [] pToken = p.getSessionToken();
|
||||
if (pToken.length != nToken.length)
|
||||
return;
|
||||
continue;
|
||||
boolean match = true;
|
||||
for (int t = 0; t < pToken.length && match; t++) {
|
||||
if (pToken[t] != nToken[t])
|
||||
@@ -107,9 +98,11 @@ public class PlayerManager extends Manager {
|
||||
p.setNetworkId(networkId);
|
||||
p.setGalaxyId(galaxyId);
|
||||
players.put(networkId, p);
|
||||
return p;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public Player getPlayerFromNetworkId(long networkId) {
|
||||
|
||||
Reference in New Issue
Block a user