mirror of
https://github.com/ProjectSWGCore/NGECore2.git
synced 2026-10-14 04:13:14 -04:00
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
import sys
|
||||
|
||||
def addZones(core):
|
||||
|
||||
gcwService = core.gcwService
|
||||
|
||||
gcwService.addPvPZone('rori', 5318, 5680, 400)
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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")) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user