diff --git a/scripts/commands/setcurrentskilltitle.py b/scripts/commands/setcurrentskilltitle.py index 9ae1cb6e..45a49f14 100644 --- a/scripts/commands/setcurrentskilltitle.py +++ b/scripts/commands/setcurrentskilltitle.py @@ -4,6 +4,12 @@ def setup(): return def run(core, actor, target, commandString): + playerObject = actor.getSlottedObject('ghost') + print ("Title set to: " + commandString) + print ("List of Titles: " + playerObject.getTitleList().toString()) + if playerObject is None: + return + playerObject.setTitle(str(commandString)) return \ No newline at end of file diff --git a/src/protocol/swg/objectControllerObjects/BuffBuilderChange.java b/src/protocol/swg/objectControllerObjects/BuffBuilderChange.java index a561a132..dcfb396c 100644 --- a/src/protocol/swg/objectControllerObjects/BuffBuilderChange.java +++ b/src/protocol/swg/objectControllerObjects/BuffBuilderChange.java @@ -8,6 +8,7 @@ import java.util.Vector; import org.apache.mina.core.buffer.IoBuffer; import protocol.swg.ObjControllerMessage; +import resources.common.Console; import resources.objects.BuffItem; public class BuffBuilderChange extends ObjControllerObject { @@ -15,6 +16,7 @@ public class BuffBuilderChange extends ObjControllerObject { private int buffCost; private int accepted; private int startTime; + private int tickCount; private long objectId; private long bufferId; @@ -22,25 +24,25 @@ public class BuffBuilderChange extends ObjControllerObject { private byte unkByte; - private Vector buffs; + private Vector buffs = new Vector(); public BuffBuilderChange() { } - public BuffBuilderChange(long objectId, long bufferId, long recipientId, int accepted, int cost) { + public BuffBuilderChange(long objectId, long bufferId, long recipientId, int accepted, int cost, byte unkByte) { this.objectId = objectId; this.bufferId = bufferId; this.recipientId = recipientId; this.accepted = accepted; this.buffCost = cost; - //this.unkByte = (byte) 0; + this.unkByte = unkByte; } @Override public void deserialize(IoBuffer data) { objectId = data.getLong(); // acting players id - data.getInt(); // tick count + tickCount = data.getInt(); // tick count bufferId = data.getLong(); // objId recipientId = data.getLong(); startTime = data.getInt(); @@ -56,10 +58,13 @@ public class BuffBuilderChange extends ObjControllerObject { stringSize = data.getShort(); String buffName = new String(ByteBuffer.allocate(stringSize).put(data.array(), data.position(), size).array(), "US-ASCII"); buff.setSkillName(buffName); + Console.println("Buff Name: " + buffName); data.position(data.position() + size); buff.setUnknown(data.getInt()); + Console.println("Buff Unknown: " + buff.getUnknown()); buff.setAmount(data.getInt()); - + Console.println("Buff Amount: " + buff.getAmount()); + buffs.add(buff); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } @@ -75,13 +80,13 @@ public class BuffBuilderChange extends ObjControllerObject { result.putInt(ObjControllerMessage.BUFF_BUILDER_CHANGE); result.putLong(objectId); - result.putInt(0); // tickCount + result.putInt(tickCount); // tickCount result.putLong(bufferId); result.putLong(recipientId); result.putInt(startTime); // starting time result.putInt(buffCost); result.putInt(accepted); - result.put((byte) 0); // default 0 + result.put(unkByte); // default 0 if (buffs == null || buffs.isEmpty()){ result.putInt(0); @@ -160,4 +165,12 @@ public class BuffBuilderChange extends ObjControllerObject { public Vector getBuffVector() { return this.buffs; } + + public int getTickCount() { + return tickCount; + } + + public void setTickCount(int tickCount) { + this.tickCount = tickCount; + } } diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 9baf46fa..23307378 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -101,7 +101,7 @@ public class CreatureObject extends TangibleObject implements IPersistent { // CREO6 private byte combatFlag = 0; - private short level = 90; + private short level = 1; private int grantedHealth = 0; private String currentAnimation; private String moodAnimation; diff --git a/src/resources/objects/player/PlayerObject.java b/src/resources/objects/player/PlayerObject.java index 4995dfb0..fa60f7c6 100644 --- a/src/resources/objects/player/PlayerObject.java +++ b/src/resources/objects/player/PlayerObject.java @@ -48,6 +48,7 @@ public class PlayerObject extends SWGObject { private String profession; private List flagsList = new ArrayList(); private List profileList = new ArrayList(); + private List titleList = new ArrayList(); private int bornDate = 0; private int totalPlayTime = 0; @@ -135,10 +136,12 @@ public class PlayerObject extends SWGObject { public void setTitle(String title) { synchronized(objectMutex) { - this.title = title; + + if(!getTitleList().isEmpty() && getTitleList().contains(title)) { + this.title = title; + notifyObservers(messageBuilder.buildTitleDelta(title), true); + } } - - notifyObservers(messageBuilder.buildTitleDelta(title), true); } public String getProfession() { @@ -560,5 +563,13 @@ public class PlayerObject extends SWGObject { this.lastPlayTimeUpdate = lastPlayTimeUpdate; } } + + public List getTitleList() { + return titleList; + } + + public void setTitleList(List titleList) { + this.titleList = titleList; + } } diff --git a/src/services/BuffService.java b/src/services/BuffService.java index 13804f83..3012a962 100644 --- a/src/services/BuffService.java +++ b/src/services/BuffService.java @@ -106,14 +106,23 @@ public class BuffService implements INetworkDispatch { return; } - if (attribute == changeMessage.getRecipientId() && attribute != changeMessage.getObjectId()) { - Console.println("Attribute check passed!"); - BuffBuilderChange recievingMsg = new BuffBuilderChange(recipient.getObjectId(), changeMessage.getBufferId(), recipient.getObjectId(), 0, changeMessage.getBuffCost()); + else if (attribute == changeMessage.getRecipientId() && attribute != changeMessage.getObjectId()) { + Console.println("Attribute check passed!"); // LAST TRIED BYTE 6 + BuffBuilderChange recievingMsg = new BuffBuilderChange(recipient.getObjectId(), changeMessage.getBufferId(), changeMessage.getRecipientId(), 0, changeMessage.getBuffCost(), (byte) 7); recievingMsg.setStartTime(changeMessage.getStartTime()); + recievingMsg.setTickCount(changeMessage.getTickCount() + 1); + + ObjControllerMessage objRcController = new ObjControllerMessage(0x23, recievingMsg); + recipient.getClient().getSession().write(objRcController.serialize()); + Console.println("Msg sent to: " + recipient.getCustomName() + " that has an ID of: " + recipient.getObjectId()); + Console.println("ObjectId: " + recievingMsg.getObjectId()); + Console.println("BufferId: " + recievingMsg.getBufferId()); + Console.println("RecipientId: " + recievingMsg.getRecipientId()); + Console.println("Buff Cost: " + recievingMsg.getBuffCost()); + Console.println("MessageRecipientId: " + recievingMsg.getRecipientId()); + + Console.println("BYTE: " + recievingMsg.getUnkByte()); - ObjControllerMessage objController = new ObjControllerMessage(0x23, recievingMsg); - recipient.getClient().getSession().write(objController.serialize()); - Console.println("Msg sent to: " + recipient.getCustomName()); } } else { diff --git a/src/services/PlayerService.java b/src/services/PlayerService.java index 8e97f5de..fd42fae1 100644 --- a/src/services/PlayerService.java +++ b/src/services/PlayerService.java @@ -26,8 +26,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Random; import java.util.Vector; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -40,6 +42,7 @@ import protocol.swg.ClientMfdStatusUpdateMessage; import protocol.swg.ExpertiseRequestMessage; import protocol.swg.ServerTimeMessage; import protocol.swg.objectControllerObjects.ShowFlyText; +import resources.common.Console; import resources.common.FileUtilities; import resources.common.Opcodes; import resources.common.RGB; @@ -48,14 +51,13 @@ import resources.objects.Buff; import resources.objects.building.BuildingObject; import resources.objects.cell.CellObject; import resources.objects.creature.CreatureObject; +import resources.objects.player.PlayerMessageBuilder; import resources.objects.player.PlayerObject; import services.sui.SUIService.ListBoxType; import services.sui.SUIWindow; import services.sui.SUIWindow.Trigger; import services.sui.SUIWindow.SUICallback; - import main.NGECore; - import engine.clientdata.ClientFileManager; import engine.clientdata.visitors.CrcStringTableVisitor; import engine.clientdata.visitors.DatatableVisitor; @@ -94,6 +96,7 @@ public class PlayerService implements INetworkDispatch { } }, 0, 30, TimeUnit.SECONDS); + } public void postZoneIn(final CreatureObject creature) { @@ -486,6 +489,26 @@ public class PlayerService implements INetworkDispatch { } } + public void addPlayerTitle(PlayerObject player, String title) { + + if (player.getTitleList().contains(title)) + return; + + player.getTitleList().add(title); + Console.println("Added title" + title); + + } + + public void removePlayerTitle(PlayerObject player, String title) { + if (player == null || title == "") + return; + + if (player.getTitleList().contains(title)) + player.getTitleList().remove(title); + + } + + @Override public void shutdown() { // TODO Auto-generated method stub diff --git a/src/services/SkillService.java b/src/services/SkillService.java index 7d3a358d..5fa961b5 100644 --- a/src/services/SkillService.java +++ b/src/services/SkillService.java @@ -23,11 +23,10 @@ package services; import java.util.Map; +import resources.common.Console; import resources.objects.creature.CreatureObject; import resources.objects.player.PlayerObject; - import main.NGECore; - import engine.clientdata.ClientFileManager; import engine.clientdata.visitors.DatatableVisitor; import engine.resources.service.INetworkDispatch; @@ -62,7 +61,7 @@ public class SkillService implements INetworkDispatch { //String parent = ((String) skillTable.getObject(s, 1)); //int graphType = ((Integer) skillTable.getObject(s, 2)); boolean godOnly = ((Boolean) skillTable.getObject(s, 3)); - //boolean isTitle = ((Boolean) skillTable.getObject(s, 4)); + boolean isTitle = ((Boolean) skillTable.getObject(s, 4)); boolean isProfession = ((Boolean) skillTable.getObject(s, 5)); boolean isHidden = ((Boolean) skillTable.getObject(s, 6)); int pointsRequired = ((Integer) skillTable.getObject(s, 8)); @@ -79,6 +78,11 @@ public class SkillService implements INetworkDispatch { String[] schematicsGranted = ((String) skillTable.getObject(s, 23)).split(","); String[] schematicsRevoked = ((String) skillTable.getObject(s, 24)).split(","); + if (isTitle == true) { + core.playerService.addPlayerTitle(player, skill); + Console.println("Gave skill title: " + skill); + } + if (isProfession) { return; } @@ -180,7 +184,7 @@ public class SkillService implements INetworkDispatch { String parent = ((String) skillTable.getObject(s, 1)); //int graphType = ((Integer) skillTable.getObject(s, 2)); boolean godOnly = ((Boolean) skillTable.getObject(s, 3)); - //boolean isTitle = ((Boolean) skillTable.getObject(s, 4)); + boolean isTitle = ((Boolean) skillTable.getObject(s, 4)); boolean isHidden = ((Boolean) skillTable.getObject(s, 6)); int pointsRequired = ((Integer) skillTable.getObject(s, 8)); String[] abilities = ((String) skillTable.getObject(s, 21)).split(","); @@ -188,6 +192,11 @@ public class SkillService implements INetworkDispatch { String[] schematicsGranted = ((String) skillTable.getObject(s, 23)).split(","); String[] schematicsRevoked = ((String) skillTable.getObject(s, 24)).split(","); + if (isTitle) { + core.playerService.removePlayerTitle(player, skill); + Console.println("Removed title: " + skill); + } + if (pointsRequired > 0) { //creature.addExpertisePoints(pointsRequired); }