From 9d99462dd06e97207fd07b93113f6ebb60040516 Mon Sep 17 00:00:00 2001 From: Ziggeh Date: Sat, 17 May 2014 15:27:29 +0200 Subject: [PATCH 1/4] Buffs - add() and remove() no longer used --- src/services/BuffService.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/services/BuffService.java b/src/services/BuffService.java index 839c2b01..de08efd2 100644 --- a/src/services/BuffService.java +++ b/src/services/BuffService.java @@ -149,15 +149,15 @@ public class BuffService implements INetworkDispatch { } } - if(FileUtilities.doesFileExist("scripts/buffs/" + buffName + ".py")) core.scriptService.callScript("scripts/buffs/", buffName, "add", core, target, buff); +/* if(FileUtilities.doesFileExist("scripts/buffs/" + buffName + ".py")) core.scriptService.callScript("scripts/buffs/", buffName, "add", core, target, buff); else - { + { */ if(buff.getEffect1Name().length() > 0) core.skillModService.addSkillMod(target, buff.getEffect1Name(), (int) buff.getEffect1Value()); if(buff.getEffect2Name().length() > 0) core.skillModService.addSkillMod(target, buff.getEffect2Name(), (int) buff.getEffect2Value()); if(buff.getEffect3Name().length() > 0) core.skillModService.addSkillMod(target, buff.getEffect3Name(), (int) buff.getEffect3Value()); if(buff.getEffect4Name().length() > 0) core.skillModService.addSkillMod(target, buff.getEffect4Name(), (int) buff.getEffect4Value()); if(buff.getEffect5Name().length() > 0) core.skillModService.addSkillMod(target, buff.getEffect5Name(), (int) buff.getEffect5Value()); - } +// } target.addBuff(buff); @@ -216,15 +216,16 @@ public class BuffService implements INetworkDispatch { dot.getTask().cancel(true); creature.removeDot(dot); } - if(FileUtilities.doesFileExist("scripts/buffs/" + buff.getBuffName() + ".py")) core.scriptService.callScript("scripts/buffs/", buff.getBuffName(), "remove", core, creature, buff); + +/* if(FileUtilities.doesFileExist("scripts/buffs/" + buff.getBuffName() + ".py")) core.scriptService.callScript("scripts/buffs/", buff.getBuffName(), "remove", core, creature, buff); else - { + {*/ if(buff.getEffect1Name().length() > 0) core.skillModService.deductSkillMod(creature, buff.getEffect1Name(), (int) buff.getEffect1Value()); if(buff.getEffect2Name().length() > 0) core.skillModService.deductSkillMod(creature, buff.getEffect2Name(), (int) buff.getEffect2Value()); if(buff.getEffect1Name().length() > 0) core.skillModService.deductSkillMod(creature, buff.getEffect3Name(), (int) buff.getEffect3Value()); if(buff.getEffect1Name().length() > 0) core.skillModService.deductSkillMod(creature, buff.getEffect4Name(), (int) buff.getEffect4Value()); if(buff.getEffect1Name().length() > 0) core.skillModService.deductSkillMod(creature, buff.getEffect5Name(), (int) buff.getEffect5Value()); - } +// } if (!buff.getCallback().equals("none") && !buff.getCallback().equals("")) { if (FileUtilities.doesFileExist("scripts/buffs/" + buff.getBuffName() + ".py")) { From 28ccc21d10989ca030bc49f2ca06fda26559595f Mon Sep 17 00:00:00 2001 From: Treeku Date: Sat, 17 May 2014 22:01:33 +0100 Subject: [PATCH 2/4] Fixed some nulls that can occur locally --- src/main/NGECore.java | 4 +++- src/services/SimulationService.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/NGECore.java b/src/main/NGECore.java index 44cab1a0..1da3308a 100644 --- a/src/main/NGECore.java +++ b/src/main/NGECore.java @@ -524,7 +524,9 @@ public class NGECore { List deletedObjects = new ArrayList(); while(cursor.hasNext()) { - SWGObject creature = (SWGObject) cursor.next(); + Object next = cursor.next(); + if (next == null) continue; + SWGObject creature = (SWGObject) next; if(!characterService.playerExists(creature.getObjectID()) && creature instanceof CreatureObject) deletedObjects.add((CreatureObject) creature); } diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index 432868e4..170a30ba 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -193,7 +193,9 @@ public class SimulationService implements INetworkDispatch { ODBCursor cursor = core.getSWGObjectODB().getCursor(); while(cursor.hasNext()) { - SWGObject building = core.objectService.getObject(((SWGObject) cursor.next()).getObjectID()); + Object next = cursor.next(); + if (next == null) continue; + SWGObject building = core.objectService.getObject(((SWGObject) next).getObjectID()); if(building == null || (!(building instanceof BuildingObject) && !(building instanceof HarvesterObject))) continue; if(building.getAttachment("hasLoadedServerTemplate") == null) From c9906907269b6ae768572252c1c8435ec6cc11e7 Mon Sep 17 00:00:00 2001 From: Light Date: Sun, 18 May 2014 00:40:45 +0200 Subject: [PATCH 3/4] Implemented PvP Zones --- scripts/commands/pvp.py | 7 +++++ scripts/pvpzones.py | 9 ++++++ src/services/SimulationService.java | 2 ++ src/services/gcw/GCWService.java | 29 ++++++++++++++++--- src/services/gcw/PvPZone.java | 45 +++++++++++++++++++++++++++++ 5 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 scripts/pvpzones.py diff --git a/scripts/commands/pvp.py b/scripts/commands/pvp.py index c313fbc4..34f6c5ff 100644 --- a/scripts/commands/pvp.py +++ b/scripts/commands/pvp.py @@ -14,6 +14,9 @@ def run(core, actor, target, commandString): if actor.getPvpStatus(PvpStatus.GoingOvert) or actor.getPvpStatus(PvpStatus.GoingCovert): actor.sendSystemMessage('@faction_recruiter:pvp_status_changing', 0) return + if core.gcwService.isInPvpZone(actor): + actor.sendSystemMessage('@gcw:pvp_advanced_region_cannot_go_covert', 0) + return if commandString != '' and commandString != faction: if commandString == 'rebel' or commandString == 'imperial' or commandString == 'neutral': @@ -60,6 +63,8 @@ def run(core, actor, target, commandString): actor.sendSystemMessage('@faction_recruiter:covert_to_overt', 0) actor.setPvpStatus(PvpStatus.GoingOvert, True) time.sleep(30) + if core.gcwService.isInPvpZone(actor): + return actor.setFactionStatus(FactionStatus.SpecialForces) actor.setPvpStatus(PvpStatus.GoingOvert, False) actor.sendSystemMessage('@faction_recruiter:overt_complete', 0) @@ -70,6 +75,8 @@ def run(core, actor, target, commandString): actor.sendSystemMessage('@faction_recruiter:overt_to_covert', 0) actor.setPvpStatus(PvpStatus.GoingCovert, True) time.sleep(300) + if core.gcwService.isInPvpZone(actor): + return actor.setFactionStatus(FactionStatus.Combatant) actor.setPvpStatus(PvpStatus.GoingCovert, False) actor.sendSystemMessage('@faction_recruiter:covert_complete', 0) diff --git a/scripts/pvpzones.py b/scripts/pvpzones.py new file mode 100644 index 00000000..91ab32ef --- /dev/null +++ b/scripts/pvpzones.py @@ -0,0 +1,9 @@ +import sys + +def addZones(core): + + gcwService = core.gcwService + + gcwService.addPvPZone('rori', 5318, 5680, 400) + + \ No newline at end of file diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index 432868e4..ecfec005 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -405,6 +405,7 @@ public class SimulationService implements INetworkDispatch { } checkForCollidables(object); + object.setAttachment("lastValidPosition", object.getPosition()); MoveEvent event = new MoveEvent(); event.object = object; object.getEventBus().publish(event); @@ -470,6 +471,7 @@ public class SimulationService implements INetworkDispatch { object.notifyObservers(utm, false); checkForCollidables(object); + object.setAttachment("lastValidPosition", object.getPosition()); } diff --git a/src/services/gcw/GCWService.java b/src/services/gcw/GCWService.java index 73d06d36..dd7bdc14 100644 --- a/src/services/gcw/GCWService.java +++ b/src/services/gcw/GCWService.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -42,20 +43,20 @@ import org.python.google.common.collect.Multimap; import protocol.swg.GcwGroupsRsp; import protocol.swg.GcwRegionsReq; import protocol.swg.GcwRegionsRsp; - import resources.common.Opcodes; +import resources.common.collidables.CollidableCircle; import resources.datatables.FactionStatus; import resources.gcw.CurrentServerGCWZoneHistory; import resources.gcw.CurrentServerGCWZonePercent; import resources.gcw.OtherServerGCWZonePercent; import resources.objects.creature.CreatureObject; import resources.objects.guild.GuildObject; - import main.NGECore; - import engine.clients.Client; import engine.resources.objects.SWGObject; +import engine.resources.scene.Planet; import engine.resources.scene.Point2D; +import engine.resources.scene.Point3D; import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; @@ -64,7 +65,7 @@ public class GCWService implements INetworkDispatch { private NGECore core; private GuildObject object; private Map> zoneMap() { return object.getZoneMap(); } - + private Map> pvpZones = new ConcurrentHashMap>(); private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); protected final Object objectMutex = new Object(); @@ -79,6 +80,7 @@ public class GCWService implements INetworkDispatch { private void afterInitialisation() { try { core.scriptService.callScript("scripts/", "gcwzones", "addZones", core); + core.scriptService.callScript("scripts/", "pvpzones", "addZones", core); } catch (Exception e) { e.printStackTrace(); } @@ -421,6 +423,25 @@ public class GCWService implements INetworkDispatch { } + public void addPvPZone(String planetName, float x, float z, float radius) { + Planet planet = core.terrainService.getPlanetByName(planetName); + if(planet == null) + return; + if(pvpZones.get(planet) == null) + pvpZones.put(planet, new ArrayList()); + CollidableCircle area = new CollidableCircle(new Point3D(x, 0, z), radius, planet); + PvPZone zone = new PvPZone(planet, area); + pvpZones.get(planet).add(zone); + core.simulationService.addCollidable(area, x, z); + } + + public boolean isInPvpZone(CreatureObject actor) { + List zones = pvpZones.get(actor.getPlanet()); + if(zones == null) + return false; + return zones.stream().anyMatch(z -> z.getArea().doesCollide(actor)); + } + @Override public void shutdown() { diff --git a/src/services/gcw/PvPZone.java b/src/services/gcw/PvPZone.java index e418327b..8f14000d 100644 --- a/src/services/gcw/PvPZone.java +++ b/src/services/gcw/PvPZone.java @@ -21,16 +21,24 @@ ******************************************************************************/ package services.gcw; +import main.NGECore; import net.engio.mbassy.listener.Handler; import resources.common.collidables.AbstractCollidable; import resources.common.collidables.AbstractCollidable.EnterEvent; import resources.common.collidables.AbstractCollidable.ExitEvent; +import resources.datatables.FactionStatus; +import resources.datatables.PvpStatus; +import resources.objects.creature.CreatureObject; +import engine.resources.objects.SWGObject; import engine.resources.scene.Planet; +import engine.resources.scene.Point3D; public class PvPZone { private Planet planet; private AbstractCollidable area; + private NGECore core = NGECore.getInstance(); + public PvPZone(Planet planet, AbstractCollidable area) { this.planet = planet; @@ -54,14 +62,51 @@ public class PvPZone { this.area = area; } + public void warpBack(CreatureObject actor) { + if (core.mountService.isMounted(actor)) { + actor = (CreatureObject) actor.getContainer(); + } + core.simulationService.teleport(actor, (Point3D) actor.getAttachment("lastValidPosition"), actor.getOrientation(), actor.getParentId()); + } + @Handler public void onEnter(EnterEvent event) { + CreatureObject actor = (CreatureObject) event.object; + + if(!actor.getFaction().equals("rebel") && !actor.getFaction().equals("imperial")) { + actor.sendSystemMessage("@gcw:pvp_advanced_region_not_allowed", (byte) 0); + warpBack(actor); + return; + } + + if(actor.getLevel() < 75) { + actor.sendSystemMessage("@gcw:pvp_advanced_region_level_low", (byte) 0); + warpBack(actor); + return; + } + + if(actor.getPvpStatus(PvpStatus.GoingCovert) || actor.getPvpStatus(PvpStatus.GoingOvert)) { + actor.setPvpStatus(PvpStatus.GoingCovert, false); + actor.setPvpStatus(PvpStatus.GoingOvert, false); + actor.sendSystemMessage("@gcw:pvp_advanced_region_faction_type_change_cancel", (byte) 0); + } + + actor.setFactionStatus(FactionStatus.SpecialForces); + actor.updatePvpStatus(); + actor.sendSystemMessage("@gcw:pvp_advanced_region_entered", (byte) 0); + } @Handler public void onExit(ExitEvent event) { + CreatureObject actor = (CreatureObject) event.object; + + actor.setFactionStatus(FactionStatus.OnLeave); + actor.updatePvpStatus(); + actor.sendSystemMessage("@gcw:pvp_advanced_region_exited", (byte) 0); + } From b3ae56e37d7c7e21667162811442641249c06a76 Mon Sep 17 00:00:00 2001 From: Light Date: Sun, 18 May 2014 01:09:38 +0200 Subject: [PATCH 4/4] Added Group Kick command --- scripts/commands/dismissgroupmember.py | 10 ++++ src/services/GroupService.java | 68 +++++++++++++++++++++----- 2 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 scripts/commands/dismissgroupmember.py diff --git a/scripts/commands/dismissgroupmember.py b/scripts/commands/dismissgroupmember.py new file mode 100644 index 00000000..7c384e0a --- /dev/null +++ b/scripts/commands/dismissgroupmember.py @@ -0,0 +1,10 @@ +import sys + +def setup(): + return + +def run(core, actor, target, commandString): + if actor and target: + core.groupService.handleGroupKick(actor, target) + return + \ No newline at end of file diff --git a/src/services/GroupService.java b/src/services/GroupService.java index 032ecd15..d9d55256 100644 --- a/src/services/GroupService.java +++ b/src/services/GroupService.java @@ -26,6 +26,8 @@ import java.util.List; import java.util.Map; import resources.buffs.Buff; +import resources.common.OutOfBand; +import resources.common.ProsePackage; import resources.objects.creature.CreatureObject; import resources.objects.group.GroupObject; import services.chat.ChatRoom; @@ -45,6 +47,7 @@ public class GroupService implements INetworkDispatch { core.commandService.registerCommand("join"); core.commandService.registerCommand("disband"); core.commandService.registerCommand("decline"); + core.commandService.registerCommand("dismissgroupmember"); } @Override @@ -74,7 +77,7 @@ public class GroupService implements INetworkDispatch { } if(memberGroupId != 0) { - leader.sendSystemMessage(member.getCustomName() + " is already in a group.", (byte) 0); + leader.sendSystemMessage(OutOfBand.ProsePackage("TT", member.getObjectID(), "@group:already_grouped"), (byte) 0); return; } @@ -96,16 +99,16 @@ public class GroupService implements INetworkDispatch { } if(member.getInviteSenderId() != 0 && member.getInviteSenderId() != leader.getObjectID()) { - leader.sendSystemMessage(member.getCustomName() + " is considering joining another group.", (byte) 0); + leader.sendSystemMessage(OutOfBand.ProsePackage("TT", member.getObjectID(), "@group:considering_other_group"), (byte) 0); return; } if(member.getInviteSenderId() != 0 && member.getInviteSenderId() == leader.getObjectID()) { - leader.sendSystemMessage(member.getCustomName() + " has already been invited to join your group.", (byte) 0); + leader.sendSystemMessage(OutOfBand.ProsePackage("TT", member.getObjectID(), "@group:considering_your_group"), (byte) 0); return; } - leader.sendSystemMessage("You invite " + member.getCustomName() + " to join the group.", (byte) 0); + leader.sendSystemMessage(OutOfBand.ProsePackage("TT", member.getObjectID(), "@group:invite_leader"), (byte) 0); member.setInviteCounter(member.getInviteCounter() + 1); member.setInviteSenderId(leader.getObjectId()); member.setInviteSenderName(leader.getCustomName()); @@ -121,11 +124,9 @@ public class GroupService implements INetworkDispatch { invited.setInviteCounter(invited.getInviteCounter() + 1); invited.setInviteSenderId(0); invited.setInviteSenderName(""); - - invited.sendSystemMessage("You decline to join " + leader.getCustomName() + "'s group.", (byte) 0); + invited.sendSystemMessage(OutOfBand.ProsePackage("TT", leader.getObjectID(), "@group:decline_self"), (byte) 0); invited.updateGroupInviteInfo(); - - leader.sendSystemMessage(invited.getCustomName() + " declines to join your group.", (byte) 0); + invited.sendSystemMessage(OutOfBand.ProsePackage("TT", invited.getObjectID(), "@group:decline_leader"), (byte) 0); } @@ -245,11 +246,11 @@ public class GroupService implements INetworkDispatch { creature.setGroupId(0); creature.makeUnaware(group); core.chatService.leaveChatRoom(creature, group.getChatRoomId()); - creature.sendSystemMessage("You have left the group.", (byte) 0); + creature.sendSystemMessage("@group:removed", (byte) 0); for(SWGObject member : memberList) { CreatureObject creature2 = (CreatureObject) member; - creature2.sendSystemMessage(creature.getCustomName() + " has left the group.", (byte) 0); + creature2.sendSystemMessage(OutOfBand.ProsePackage("TU", creature.getObjectID(), "@group:other_left_prose"), (byte) 0); } removeGroupBuffs(creature); @@ -272,7 +273,7 @@ public class GroupService implements INetworkDispatch { creature2.makeUnaware(group); core.chatService.leaveChatRoom(creature2, group.getChatRoomId()); - creature2.sendSystemMessage("The group has been disbanded.", (byte) 0); + creature.sendSystemMessage("@group:disbanded", (byte) 0); removeGroupBuffs((CreatureObject) member); @@ -285,4 +286,49 @@ public class GroupService implements INetworkDispatch { public void handleGroupDisband(CreatureObject creature) { handleGroupDisband(creature, true); } + + public void removedFromGroup(GroupObject group, CreatureObject creature) { + removeFromGroup(group, creature, false); + } + + public void removeFromGroup(GroupObject group, CreatureObject creature, boolean kicked) { + + group.removeMember(creature); + creature.setInviteCounter(creature.getInviteCounter() + 1); + creature.setInviteSenderId(0); + creature.setInviteSenderName(""); + creature.updateGroupInviteInfo(); + creature.setGroupId(0); + creature.makeUnaware(group); + core.chatService.leaveChatRoom(creature, group.getChatRoomId()); + creature.sendSystemMessage("@group:removed", (byte) 0); + + for(SWGObject member : group.getMemberList()) { + CreatureObject creature2 = (CreatureObject) member; + creature2.sendSystemMessage(OutOfBand.ProsePackage("TU", creature.getObjectID(), "@group:other_left_prose"), (byte) 0); + } + + removeGroupBuffs(creature); + + if(group.getMemberList().size() <= 1 && kicked) + handleGroupDisband((CreatureObject) group.getGroupLeader()); + + } + + public void handleGroupKick(CreatureObject leader, CreatureObject member) { + + GroupObject group = (GroupObject) core.objectService.getObject(leader.getGroupId()); + + if(group == null || member.getGroupId() == 0 || member.getGroupId() != group.getObjectID()) + return; + + if(group.getGroupLeader() != leader) { + leader.sendSystemMessage("@group:must_be_leader", (byte) 0); + return; + } + + removeFromGroup(group, member, true); + + } + }