Merge pull request #3 from ProjectSWGCore/master

gdxg
This commit is contained in:
tacef
2014-05-18 10:51:15 +02:00
9 changed files with 168 additions and 23 deletions
+10
View File
@@ -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
+7
View File
@@ -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)
+9
View File
@@ -0,0 +1,9 @@
import sys
def addZones(core):
gcwService = core.gcwService
gcwService.addPvPZone('rori', 5318, 5680, 400)
+3 -1
View File
@@ -524,7 +524,9 @@ public class NGECore {
List<CreatureObject> deletedObjects = new ArrayList<CreatureObject>();
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);
}
+7 -6
View File
@@ -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")) {
+57 -11
View File
@@ -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);
}
}
+5 -1
View File
@@ -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)
@@ -405,6 +407,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 +473,7 @@ public class SimulationService implements INetworkDispatch {
object.notifyObservers(utm, false);
checkForCollidables(object);
object.setAttachment("lastValidPosition", object.getPosition());
}
+25 -4
View File
@@ -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<String, Map<String, CurrentServerGCWZonePercent>> zoneMap() { return object.getZoneMap(); }
private Map<Planet, List<PvPZone>> pvpZones = new ConcurrentHashMap<Planet, List<PvPZone>>();
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<PvPZone>());
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<PvPZone> zones = pvpZones.get(actor.getPlanet());
if(zones == null)
return false;
return zones.stream().anyMatch(z -> z.getArea().doesCollide(actor));
}
@Override
public void shutdown() {
+45
View File
@@ -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);
}