Refactored CreatureObject

This commit is contained in:
Treeku
2014-08-16 20:35:06 +01:00
parent 51c14284eb
commit 0175a6716e
23 changed files with 1769 additions and 2865 deletions
@@ -25,7 +25,6 @@ import java.io.UnsupportedEncodingException;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import main.NGECore;
+339 -244
View File
@@ -21,8 +21,6 @@
******************************************************************************/
package resources.buffs;
import java.io.Serializable;
import java.nio.ByteOrder;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
@@ -30,50 +28,43 @@ import java.util.concurrent.TimeUnit;
import main.NGECore;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.buffer.SimpleBufferAllocator;
import resources.objects.creature.CreatureObject;
import com.sleepycat.persist.model.NotPersistent;
import engine.clientdata.ClientFileManager;
import engine.clientdata.visitors.DatatableVisitor;
import engine.resources.objects.Delta;
import engine.resources.common.CRC;
import engine.resources.objects.IDelta;
import engine.resources.objects.SWGObject;
public class Buff implements IDelta, Serializable {
public class Buff extends Delta {
private static final long serialVersionUID = 1L;
@NotPersistent
private transient static SimpleBufferAllocator bufferPool = new SimpleBufferAllocator();
private String group1, group2;
private int priority;
private float duration;
private String buffName;
private long ownerId;
private String effect1Name, effect2Name, effect3Name, effect4Name, effect5Name;
private String group1 = "", group2 = "";
private int priority = 0;
private float duration = 0;
private String buffName = "";
private long ownerId = 0;
private String effect1Name = "", effect2Name = "", effect3Name = "", effect4Name = "", effect5Name = "";
private float effect1Value, effect2Value, effect3Value, effect4Value, effect5Value;
private String callback;
private String particleEffect;
private boolean isDebuff;
private boolean removeOnDeath;
private boolean isRemovableByPlayer;
private int maxStacks;
private boolean isPersistent;
private boolean removeOnRespec;
private boolean aiRemoveOnEndCombat;
private boolean decayOnPvPDeath;
private long startTime;
private int totalPlayTime;
private String callback = "";
private String particleEffect = "";
private boolean isDebuff = false;
private boolean removeOnDeath = false;
private boolean isRemovableByPlayer = false;
private int maxStacks = 0;
private boolean isPersistent = false;
private boolean removeOnRespec = false;
private boolean aiRemoveOnEndCombat = false;
private boolean decayOnPvPDeath = false;
private long startTime = 0;
private int totalPlayTime = 0;
private byte decayCounter = 0;
@NotPersistent
private transient ScheduledFuture<?> removalTask;
private int stacks = 1;
private long groupBufferId;
private int buffCRC;
private long groupBufferId = 0;
public Buff(Buff baseBuff, long ownerId) {
this.buffName = baseBuff.getBuffName();
this.buffCRC = baseBuff.getBuffCRC();
this.group1 = baseBuff.getGroup1();
this.group2 = baseBuff.getGroup2();
this.priority = baseBuff.getPriority();
@@ -100,398 +91,502 @@ public class Buff implements IDelta, Serializable {
this.decayOnPvPDeath = baseBuff.isDecayOnPvPDeath();
}
/*public Buff(String buffName, long ownerId) {
public Buff(String buffName, long ownerId) {
this.buffName = buffName;
this.ownerId = ownerId;
this.buffCRC = CRC.StringtoCRC(buffName);
DatatableVisitor visitor;
try {
visitor = ClientFileManager.loadFile("datatables/buff/buff.iff", DatatableVisitor.class);
for(int i = 0; i < visitor.getRowCount(); i++) {
if(visitor.getObject(i, 0) != null)
if(((String) visitor.getObject(i, 0)).equalsIgnoreCase(buffName)) {
group1 = (String) visitor.getObject(i, 1);
group2 = (String) visitor.getObject(i, 2);
priority = (int) visitor.getObject(i, 4);
duration = (Float) visitor.getObject(i, 6);
effect1Name = (String) visitor.getObject(i, 7);
effect1Value = (Float) visitor.getObject(i, 8);
effect2Name = (String) visitor.getObject(i, 9);
effect2Value = (Float) visitor.getObject(i, 10);
effect3Name = (String) visitor.getObject(i, 11);
effect3Value = (Float) visitor.getObject(i, 12);
effect4Name = (String) visitor.getObject(i, 13);
effect4Value = (Float) visitor.getObject(i, 14);
effect5Name = (String) visitor.getObject(i, 15);
effect5Value = (Float) visitor.getObject(i, 16);
callback = (String) visitor.getObject(i, 18);
particleEffect = (String) visitor.getObject(i, 19);
isDebuff = (Boolean) visitor.getObject(i, 22);
removeOnDeath = (Integer) visitor.getObject(i, 25) != 0;
isRemovableByPlayer = (Integer) visitor.getObject(i, 26) != 0;
maxStacks = (Integer) visitor.getObject(i, 28);
isPersistent = (Integer) visitor.getObject(i, 29) != 0;
removeOnRespec = (Integer) visitor.getObject(i, 31) != 0;
aiRemoveOnEndCombat = (Integer) visitor.getObject(i, 32) != 0;
decayOnPvPDeath = (Integer) visitor.getObject(i, 33) != 0;
for (int i = 0; i < visitor.getRowCount(); i++) {
if (visitor.getObject(i, 0) != null) {
if (((String) visitor.getObject(i, 0)).equalsIgnoreCase(buffName)) {
group1 = (String) visitor.getObject(i, 1);
group2 = (String) visitor.getObject(i, 2);
priority = (int) visitor.getObject(i, 4);
duration = (Float) visitor.getObject(i, 6);
effect1Name = (String) visitor.getObject(i, 7);
effect1Value = (Float) visitor.getObject(i, 8);
effect2Name = (String) visitor.getObject(i, 9);
effect2Value = (Float) visitor.getObject(i, 10);
effect3Name = (String) visitor.getObject(i, 11);
effect3Value = (Float) visitor.getObject(i, 12);
effect4Name = (String) visitor.getObject(i, 13);
effect4Value = (Float) visitor.getObject(i, 14);
effect5Name = (String) visitor.getObject(i, 15);
effect5Value = (Float) visitor.getObject(i, 16);
callback = (String) visitor.getObject(i, 18);
particleEffect = (String) visitor.getObject(i, 19);
isDebuff = (Boolean) visitor.getObject(i, 22);
removeOnDeath = (Integer) visitor.getObject(i, 25) != 0;
isRemovableByPlayer = (Integer) visitor.getObject(i, 26) != 0;
maxStacks = (Integer) visitor.getObject(i, 28);
isPersistent = (Integer) visitor.getObject(i, 29) != 0;
removeOnRespec = (Integer) visitor.getObject(i, 31) != 0;
aiRemoveOnEndCombat = (Integer) visitor.getObject(i, 32) != 0;
decayOnPvPDeath = (Integer) visitor.getObject(i, 33) != 0;
}
}
}
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
}*/
public Buff() { }
}
@Override
public void init(SWGObject object) {
// TODO Auto-generated method stub
public Buff() {
}
@Override
public byte[] getBytes() {
IoBuffer buffer = bufferPool.allocate(28, false).order(ByteOrder.LITTLE_ENDIAN);
buffer.putInt(CRC.StringtoCRC(buffName.toLowerCase()));
if(duration > 0) {
buffer.putInt((int) (totalPlayTime + getRemainingDuration()));
buffer.putInt(0);
buffer.putInt((int) duration);
} else {
buffer.putInt(-1);
buffer.putInt(0);
buffer.putInt(0);
synchronized(objectMutex) {
IoBuffer buffer = createBuffer(24);
if (duration > 0) {
buffer.putInt((int) (totalPlayTime + getRemainingDuration()));
buffer.putInt(0);
buffer.putInt((int) duration);
} else {
buffer.putInt(-1);
buffer.putInt(0);
buffer.putInt(0);
}
buffer.putLong(ownerId);
buffer.putInt(stacks);
buffer.flip();
return buffer.array();
}
buffer.putLong(ownerId);
buffer.putInt(stacks); // stacks
buffer.flip();
return buffer.array();
}
public String getGroup1() {
return group1;
synchronized(objectMutex) {
return group1;
}
}
public void setGroup1(String group1) {
this.group1 = group1;
synchronized(objectMutex) {
this.group1 = group1;
}
}
public String getGroup2() {
synchronized(objectMutex) {
return group2;
}
}
public void setGroup2(String group2) {
synchronized(objectMutex) {
this.group2 = group2;
}
}
public int getPriority() {
return priority;
synchronized(objectMutex) {
return priority;
}
}
public void setPriority(int priority) {
this.priority = priority;
synchronized(objectMutex) {
this.priority = priority;
}
}
public float getDuration() {
return duration;
synchronized(objectMutex) {
return duration;
}
}
public void setDuration(float duration) {
this.duration = duration;
synchronized(objectMutex) {
this.duration = duration;
}
}
public String getBuffName() {
return buffName;
synchronized(objectMutex) {
return buffName;
}
}
public void setBuffName(String buffName) {
this.buffName = buffName;
synchronized(objectMutex) {
this.buffName = buffName;
}
}
public long getOwnerId() {
return ownerId;
synchronized(objectMutex) {
return ownerId;
}
}
public void setOwnerId(long ownerId) {
this.ownerId = ownerId;
synchronized(objectMutex) {
this.ownerId = ownerId;
}
}
public String getEffect1Name() {
return effect1Name;
synchronized(objectMutex) {
return effect1Name;
}
}
public void setEffect1Name(String effect1Name) {
this.effect1Name = effect1Name;
synchronized(objectMutex) {
this.effect1Name = effect1Name;
}
}
public String getEffect2Name() {
return effect2Name;
synchronized(objectMutex) {
return effect2Name;
}
}
public void setEffect2Name(String effect2Name) {
this.effect2Name = effect2Name;
synchronized(objectMutex) {
this.effect2Name = effect2Name;
}
}
public String getEffect3Name() {
return effect3Name;
synchronized(objectMutex) {
return effect3Name;
}
}
public void setEffect3Name(String effect3Name) {
this.effect3Name = effect3Name;
synchronized(objectMutex) {
this.effect3Name = effect3Name;
}
}
public String getEffect4Name() {
return effect4Name;
synchronized(objectMutex) {
return effect4Name;
}
}
public void setEffect4Name(String effect4Name) {
this.effect4Name = effect4Name;
synchronized(objectMutex) {
this.effect4Name = effect4Name;
}
}
public String getEffect5Name() {
return effect5Name;
synchronized(objectMutex) {
return effect5Name;
}
}
public void setEffect5Name(String effect5Name) {
this.effect5Name = effect5Name;
synchronized(objectMutex) {
this.effect5Name = effect5Name;
}
}
public float getEffect1Value() {
return effect1Value;
synchronized(objectMutex) {
return effect1Value;
}
}
public void setEffect1Value(float effect1Value) {
this.effect1Value = effect1Value;
synchronized(objectMutex) {
this.effect1Value = effect1Value;
}
}
public float getEffect2Value() {
return effect2Value;
synchronized(objectMutex) {
return effect2Value;
}
}
public void setEffect2Value(float effect2Value) {
this.effect2Value = effect2Value;
synchronized(objectMutex) {
this.effect2Value = effect2Value;
}
}
public float getEffect3Value() {
return effect3Value;
synchronized(objectMutex) {
return effect3Value;
}
}
public void setEffect3Value(float effect3Value) {
this.effect3Value = effect3Value;
synchronized(objectMutex) {
this.effect3Value = effect3Value;
}
}
public float getEffect4Value() {
return effect4Value;
synchronized(objectMutex) {
return effect4Value;
}
}
public void setEffect4Value(float effect4Value) {
this.effect4Value = effect4Value;
synchronized(objectMutex) {
this.effect4Value = effect4Value;
}
}
public float getEffect5Value() {
return effect5Value;
synchronized(objectMutex) {
return effect5Value;
}
}
public void setEffect5Value(float effect5Value) {
this.effect5Value = effect5Value;
synchronized(objectMutex) {
this.effect5Value = effect5Value;
}
}
public String getCallback() {
return callback;
synchronized(objectMutex) {
return callback;
}
}
public void setCallback(String callback) {
this.callback = callback;
synchronized(objectMutex) {
this.callback = callback;
}
}
public String getParticleEffect() {
return particleEffect;
synchronized(objectMutex) {
return particleEffect;
}
}
public void setParticleEffect(String particleEffect) {
this.particleEffect = particleEffect;
synchronized(objectMutex) {
this.particleEffect = particleEffect;
}
}
public boolean isDebuff() {
return isDebuff;
synchronized(objectMutex) {
return isDebuff;
}
}
public void setDebuff(boolean isDebuff) {
this.isDebuff = isDebuff;
synchronized(objectMutex) {
this.isDebuff = isDebuff;
}
}
public boolean isRemoveOnDeath() {
return removeOnDeath;
synchronized(objectMutex) {
return removeOnDeath;
}
}
public void setRemoveOnDeath(boolean removeOnDeath) {
this.removeOnDeath = removeOnDeath;
synchronized(objectMutex) {
this.removeOnDeath = removeOnDeath;
}
}
public boolean isRemovableByPlayer() {
return isRemovableByPlayer;
synchronized(objectMutex) {
return isRemovableByPlayer;
}
}
public void setRemovableByPlayer(boolean isRemovableByPlayer) {
this.isRemovableByPlayer = isRemovableByPlayer;
synchronized(objectMutex) {
this.isRemovableByPlayer = isRemovableByPlayer;
}
}
public int getMaxStacks() {
return maxStacks;
synchronized(objectMutex) {
return maxStacks;
}
}
public void setMaxStacks(int maxStacks) {
this.maxStacks = maxStacks;
synchronized(objectMutex) {
this.maxStacks = maxStacks;
}
}
public boolean isPersistent() {
return isPersistent;
synchronized(objectMutex) {
return isPersistent;
}
}
public void setPersistent(boolean isPersistent) {
this.isPersistent = isPersistent;
synchronized(objectMutex) {
this.isPersistent = isPersistent;
}
}
public boolean isRemoveOnRespec() {
return removeOnRespec;
synchronized(objectMutex) {
return removeOnRespec;
}
}
public void setRemoveOnRespec(boolean removeOnRespec) {
this.removeOnRespec = removeOnRespec;
synchronized(objectMutex) {
this.removeOnRespec = removeOnRespec;
}
}
public boolean isAiRemoveOnEndCombat() {
return aiRemoveOnEndCombat;
synchronized(objectMutex) {
return aiRemoveOnEndCombat;
}
}
public void setAiRemoveOnEndCombat(boolean aiRemoveOnEndCombat) {
this.aiRemoveOnEndCombat = aiRemoveOnEndCombat;
synchronized(objectMutex) {
this.aiRemoveOnEndCombat = aiRemoveOnEndCombat;
}
}
public boolean isDecayOnPvPDeath() {
return decayOnPvPDeath;
synchronized(objectMutex) {
return decayOnPvPDeath;
}
}
public void setDecayOnPvPDeath(boolean decayOnPvPDeath) {
this.decayOnPvPDeath = decayOnPvPDeath;
synchronized(objectMutex) {
this.decayOnPvPDeath = decayOnPvPDeath;
}
}
public void setStartTime() {
this.startTime = System.currentTimeMillis();
synchronized(objectMutex) {
this.startTime = System.currentTimeMillis();
}
}
public long getStartTime() {
return startTime;
synchronized(objectMutex) {
return startTime;
}
}
public int getRemainingDuration() {
long currentTime = System.currentTimeMillis();
long timeDiff = (currentTime - startTime) / 1000;
int remaining = (int) (duration - timeDiff);
for(int i = 0; i < decayCounter; i++) {
remaining /= 2;
synchronized(objectMutex) {
long currentTime = System.currentTimeMillis();
long timeDiff = (currentTime - startTime) / 1000;
int remaining = (int) (duration - timeDiff);
for (int i = 0; i < decayCounter; i++) {
remaining /= 2;
}
return remaining;
}
return remaining;
}
public int getTotalPlayTime() {
return totalPlayTime;
synchronized(objectMutex) {
return totalPlayTime;
}
}
public void setTotalPlayTime(int totalPlayTime) {
this.totalPlayTime = totalPlayTime;
synchronized(objectMutex) {
this.totalPlayTime = totalPlayTime;
}
}
public byte getDecayCounter() {
return decayCounter;
synchronized(objectMutex) {
return decayCounter;
}
}
public void incDecayCounter() {
this.decayCounter++;
synchronized(objectMutex) {
this.decayCounter++;
}
}
public ScheduledFuture<?> getRemovalTask() {
return removalTask;
}
public void setRemovalTask(ScheduledFuture<?> removalTask) {
this.removalTask = removalTask;
}
public void updateRemovalTask() {
if(removalTask == null)
if (removalTask == null) {
return;
}
removalTask.cancel(true);
final NGECore core = NGECore.getInstance();
final CreatureObject owner = (CreatureObject) core.objectService.getObject(getOwnerId());
if(owner == null)
if (owner == null) {
return;
}
ScheduledFuture<?> task = Executors.newScheduledThreadPool(1).schedule(new Runnable() {
@Override
public void run() {
try {
core.buffService.removeBuffFromCreature(owner, Buff.this);
} catch (Exception e) {
e.printStackTrace();
}
}
}, (long) getRemainingDuration(), TimeUnit.SECONDS);
setRemovalTask(task);
}
public int getStacks() {
return stacks;
synchronized(objectMutex) {
return stacks;
}
}
public void setStacks(int stacks) {
this.stacks = stacks;
synchronized(objectMutex) {
this.stacks = stacks;
}
}
public boolean isGroupBuff() {
return effect1Name == null ? false : effect1Name.equals("group");
}
public long getGroupBufferId() {
return groupBufferId;
}
public void setGroupBufferId(long groupBufferId) {
this.groupBufferId = groupBufferId;
}
public String getGroup2() {
return group2;
}
public void setGroup2(String group2) {
this.group2 = group2;
}
public int getBuffCRC() {
return buffCRC;
synchronized(objectMutex) {
return effect1Name.equals("group");
}
}
public void setBuffCRC(int buffCRC) {
this.buffCRC = buffCRC;
public long getGroupBufferId() {
synchronized(objectMutex) {
return groupBufferId;
}
}
public void setGroupBufferId(long groupBufferId) {
synchronized(objectMutex) {
this.groupBufferId = groupBufferId;
}
}
}
+91
View File
@@ -0,0 +1,91 @@
/*******************************************************************************
* Copyright (c) 2013 <Project SWG>
*
* This File is part of NGECore2.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Using NGEngine to work with NGECore2 is making a combined work based on NGEngine.
* Therefore all terms and conditions of the GNU Lesser General Public License cover the combination.
******************************************************************************/
package resources.buffs;
import java.util.Map.Entry;
import org.apache.mina.core.buffer.IoBuffer;
import engine.resources.objects.Delta;
import resources.objects.SWGMap;
public class BuffList extends Delta {
private static final long serialVersionUID = 1L;
private SWGMap<Integer, Buff> list;
public BuffList(SWGMap<Integer, Buff> list) {
this.list = list;
}
public BuffList() {
}
public SWGMap<Integer, Buff> getList() {
synchronized(objectMutex) {
return list;
}
}
public byte[] getBytes() {
int size = 8 + ((list.size() > 0) ? 4 : 0);
for (Buff buff : list.values().toArray(new Buff[] { })) {
size += (25 + ((buff.getBuffName().equals("")) ? 0 : 4));
}
IoBuffer buffer = createBuffer(size);
buffer.putInt(list.size());
buffer.putInt(list.getUpdateCounter());
for (Entry<Integer, Buff> entry : list.entrySet()) {
int crc = entry.getKey();
Buff buff = entry.getValue();
buffer.put(getBoolean(!buff.getBuffName().equals("")));
if (!buff.getBuffName().equals("")) {
buffer.putInt(0);
}
buffer.putInt(crc);
if (buff.getDuration() > 0) {
buffer.putInt((int) (buff.getTotalPlayTime() + buff.getRemainingDuration()));
buffer.putInt(0);
buffer.putInt((int) buff.getDuration());
} else {
buffer.putInt(-1);
buffer.putInt(0);
if (buff.getBuffName().equals("")) {
buffer.putInt(0);
} else {
buffer.putInt(-1);
}
}
buffer.putLong(buff.getOwnerId());
}
if (list.size() > 0) {
buffer.putInt(1);
}
return buffer.array();
}
}
+96
View File
@@ -0,0 +1,96 @@
/*******************************************************************************
* Copyright (c) 2013 <Project SWG>
*
* This File is part of NGECore2.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Using NGEngine to work with NGECore2 is making a combined work based on NGEngine.
* Therefore all terms and conditions of the GNU Lesser General Public License cover the combination.
******************************************************************************/
package resources.equipment;
import main.NGECore;
import org.apache.mina.core.buffer.IoBuffer;
import engine.resources.common.CRC;
import engine.resources.objects.Delta;
import engine.resources.objects.SWGObject;
import resources.objects.tangible.TangibleObject;
import resources.objects.weapon.WeaponObject;
public class Equipment extends Delta {
private static final long serialVersionUID = 1L;
private long objectId;
public Equipment(SWGObject object) {
this.objectId = ((object instanceof TangibleObject) ? object.getObjectID() : 0);
}
public Equipment() {
}
public SWGObject getObject() {
synchronized(objectMutex) {
return NGECore.getInstance().objectService.getObject(objectId);
}
}
public long getObjectId() {
synchronized(objectMutex) {
return objectId;
}
}
public byte[] getBytes() {
if (!(getObject() instanceof TangibleObject)) {
if (getObject() == null) {
System.err.println("Serious error: Equipment object is null in objectList.");
} else {
System.err.println("Serious error: Equipment object isn't a TangibleObject");
}
}
TangibleObject object = (TangibleObject) getObject();
synchronized(objectMutex) {
int size = 19 + object.getCustomization ().length;
if (object instanceof WeaponObject) {
size += ((WeaponObject) object).getBaseline(3).getBaseline().array().length;
size += ((WeaponObject) object).getBaseline(6).getBaseline().array().length;
}
IoBuffer buffer = createBuffer(size);
buffer.putShort((short) object.getCustomization().length);
buffer.put(object.getCustomization());
buffer.putInt(object.getArrangementId());
buffer.putLong(object.getObjectID());
buffer.putInt(CRC.StringtoCRC(object.getTemplate()));
buffer.put(getBoolean((object instanceof WeaponObject)));
if (object instanceof WeaponObject) {
buffer.put(((WeaponObject) object).getBaseline(3).getBaseline().array());
buffer.put(((WeaponObject) object).getBaseline(6).getBaseline().array());
}
buffer.flip();
return buffer.array();
}
}
}
+77
View File
@@ -0,0 +1,77 @@
/*******************************************************************************
* Copyright (c) 2013 <Project SWG>
*
* This File is part of NGECore2.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Using NGEngine to work with NGECore2 is making a combined work based on NGEngine.
* Therefore all terms and conditions of the GNU Lesser General Public License cover the combination.
******************************************************************************/
package resources.group;
import org.apache.mina.core.buffer.IoBuffer;
import engine.resources.common.AString;
import engine.resources.objects.Delta;
public class GroupInviteInfo extends Delta {
private static final long serialVersionUID = 1L;
private long senderId;
private AString senderName;
private long inviteCounter;
public GroupInviteInfo(long senderId, String senderName) {
this.senderId = senderId;
this.senderName = new AString(senderName);
inviteCounter = 0;
}
public GroupInviteInfo() {
}
public long getSenderId() {
synchronized(objectMutex) {
return senderId;
}
}
public String getSenderName() {
synchronized(objectMutex) {
return senderName.get();
}
}
public void setSender(long senderId, String senderName) {
synchronized(objectMutex) {
this.senderId = senderId;
this.senderName = new AString(senderName);
inviteCounter++;
}
}
public byte[] getBytes() {
synchronized(objectMutex) {
IoBuffer buffer = createBuffer(16 + senderName.getBytes().length);
buffer.putLong(senderId);
buffer.put(senderName.getBytes());
buffer.putLong(inviteCounter);
return buffer.array();
}
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+4 -6
View File
@@ -40,7 +40,6 @@ import resources.objects.player.PlayerObject;
import main.NGECore;
import engine.clientdata.ClientFileManager;
import engine.clientdata.visitors.DatatableVisitor;
import engine.resources.common.CRC;
import engine.resources.objects.SWGObject;
import engine.resources.service.INetworkDispatch;
import engine.resources.service.INetworkRemoteEvent;
@@ -142,7 +141,7 @@ public class BuffService implements INetworkDispatch {
for (final Buff otherBuff : target.getBuffList()) {
for (final Buff otherBuff : target.getBuffList().values()) {
if (buff.getGroup1().equals(otherBuff.getGroup1()))
if (buff.getPriority() >= otherBuff.getPriority()) {
if (buff.getBuffName().equals(otherBuff.getBuffName()))
@@ -241,7 +240,7 @@ public class BuffService implements INetworkDispatch {
@SuppressWarnings("unused")
public void removeBuffFromCreature(CreatureObject creature, Buff buff)
{
if(!creature.getBuffList().contains(buff))
if(!creature.getBuffList().containsValue(buff))
{
return;
}
@@ -342,7 +341,7 @@ public class BuffService implements INetworkDispatch {
// copy to array for thread safety
for(final Buff buff : creature.getBuffList().get().toArray(new Buff[] { })) {
for(final Buff buff : creature.getBuffList().values().toArray(new Buff[] { })) {
if (buff.getRemovalTask() != null) { continue; }
@@ -374,7 +373,7 @@ public class BuffService implements INetworkDispatch {
public boolean hasBuff(final CreatureObject creature, String buffName) {
for(final Buff buff : creature.getBuffList().get().toArray(new Buff[] { })) {
for(final Buff buff : creature.getBuffList().values().toArray(new Buff[] { })) {
if (buff.getBuffName().contains(buffName)) { return true; }
}
return false;
@@ -423,7 +422,6 @@ public class BuffService implements INetworkDispatch {
String name = (String) visitor.getObject(i, 0);
buff.setBuffName(name);
buff.setBuffCRC(CRC.StringtoCRC(name));
buff.setGroup1((String) visitor.getObject(i, 1));
buff.setGroup2((String) visitor.getObject(i, 2));
buff.setPriority((int) visitor.getObject(i, 4));
+11 -9
View File
@@ -688,12 +688,14 @@ public class EntertainmentService implements INetworkDispatch {
}
public void startPerformance(CreatureObject actor, int performanceId, int performanceCounter, String skillName, boolean isDance) {
actor.setPerformanceId(performanceId, isDance);
actor.setPerformanceId((isDance) ? 0 : performanceId);
actor.setPerformanceCounter(performanceCounter);
actor.setCurrentAnimation(skillName);
actor.setPerformanceType(isDance);
actor.startPerformance();
if (!actor.isPerforming()) {
actor.setPerforming(true);
}
}
public void startPerformanceExperience(final CreatureObject entertainer) {
@@ -722,13 +724,13 @@ public class EntertainmentService implements INetworkDispatch {
}
public void startSpectating(final CreatureObject spectator, final CreatureObject performer, boolean spectateType) {
public void startSpectating(final CreatureObject spectator, final CreatureObject performer, String spectateType) {
// visual
if (spectator.getPerformanceWatchee() == performer && spectateType)
if (spectator.getPerformanceWatchee() == performer && spectateType.equals("dance"))
spectator.getPerformanceWatchee().removeSpectator(spectator);
// music
else if (spectator.getPerformanceListenee() == performer && !spectateType)
else if (spectator.getPerformanceListenee() == performer && spectateType.equals("musci"))
spectator.getPerformanceListenee().removeSpectator(spectator);
spectator.setPerformanceWatchee(performer);
@@ -739,7 +741,7 @@ public class EntertainmentService implements INetworkDispatch {
try {
if (spectator.getWorldPosition().getDistance2D(performer.getWorldPosition()) > (float) 70) {
if(((performer.getPerformanceType()) ? "dance" : "music").equals("dance")) {
if(performer.getPerformanceType().equals("dance")) {
spectator.setPerformanceWatchee(null);
spectator.sendSystemMessage("You stop watching " + performer.getCustomName() + " because " + performer.getCustomName()
+ " is out of range.", (byte) 0);
@@ -770,7 +772,7 @@ public class EntertainmentService implements INetworkDispatch {
handleInspirationTicks(spectator, performer);
}
if(spectateType)
if(spectateType.equals("dance"))
spectator.sendSystemMessage("You start watching " + performer.getCustomName() + ".", (byte) 0);
else
spectator.sendSystemMessage("You start listening to " + performer.getCustomName() + ".", (byte) 0);
@@ -778,7 +780,7 @@ public class EntertainmentService implements INetworkDispatch {
}
public void performFlourish(final CreatureObject performer, int flourish) {
// FIXME There wasn't a limit on flourishes; they just queued up.
if (performer.getFlourishCount() > 0 || performer.isPerformingFlourish()) {
performer.sendSystemMessage("@performance:flourish_wait_self", (byte) 0);
return;
@@ -814,7 +816,7 @@ public class EntertainmentService implements INetworkDispatch {
if(pEffect == null)
return false;
String performance = (performer.getPerformanceType()) ? "dance" : "music";
String performance = performer.getPerformanceType();
if(performer.isPerformingEffect()) {
performer.sendSystemMessage("@performance:effect_wait_self", (byte) 0);
+2 -2
View File
@@ -209,7 +209,7 @@ public class GroupService implements INetworkDispatch {
// loop until we find a member other than ourself
for(SWGObject otherMember : group.getMemberList()) {
if(otherMember != member) {
for(Buff buff : ((CreatureObject) otherMember).getBuffList().get()) {
for(Buff buff : ((CreatureObject) otherMember).getBuffList().values()) {
if(buff.isGroupBuff() && otherMember.getPlanet() == member.getPlanet() && otherMember.getWorldPosition().getDistance2D(member.getWorldPosition()) <= 80) {
core.buffService.addBuffToCreature((CreatureObject) otherMember, buff.getBuffName(), member);
}
@@ -221,7 +221,7 @@ public class GroupService implements INetworkDispatch {
}
public void removeGroupBuffs(CreatureObject member) {
for(Buff buff : new ArrayList<Buff>(member.getBuffList().get())) {
for(Buff buff : new ArrayList<Buff>(member.getBuffList().values())) {
if(buff.isGroupBuff() && buff.getGroupBufferId() != member.getObjectID()) {
core.buffService.removeBuffFromCreature(member, buff);
}
+1 -1
View File
@@ -242,7 +242,7 @@ public class LootService implements INetworkDispatch {
if (droppedItem.getAttachment("LootItemName").toString().contains("Loot Chest")){
lootedObject.playEffectObject("appearance/pt_rare_chest.prt", "");
requester.playMusicSelf("sound/rare_loot_chest.snd", requester.getObjectID(),1,false);
requester.playMusic("sound/rare_loot_chest.snd", requester.getObjectID(),1,false);
}
}
+13 -12
View File
@@ -70,6 +70,7 @@ import resources.datatables.DisplayType;
import resources.datatables.Options;
import resources.datatables.PlayerFlags;
import resources.datatables.Professions;
import resources.equipment.Equipment;
import resources.guild.Guild;
import resources.objects.building.BuildingObject;
import resources.objects.cell.CellObject;
@@ -143,7 +144,7 @@ public class PlayerService implements INetworkDispatch {
scheduleList.add(scheduler.scheduleAtFixedRate(() -> {
try {
if (creature.isInStealth() && !creature.getOption(Options.INVULNERABLE) && ((PlayerObject) creature.getSlottedObject("ghost")).getGodLevel() == 0) {
if (creature.isCloaked() && !creature.getOption(Options.INVULNERABLE) && ((PlayerObject) creature.getSlottedObject("ghost")).getGodLevel() == 0) {
List<SWGObject> objects = core.simulationService.get(creature.getPlanet(), creature.getPosition().x, creature.getPosition().z, 64);
for (SWGObject object : objects) {
@@ -161,7 +162,7 @@ public class PlayerService implements INetworkDispatch {
camoflauge -= (64 - creature.getPosition().getDistance(observer.getPosition()));
if (new Random(camoflauge).nextInt() == camoflauge) {
creature.setInStealth(false);
creature.setCloaked(false);
}
}
}
@@ -594,7 +595,7 @@ public class PlayerService implements INetworkDispatch {
creature.setTurnRadius(1);
if(pvpDeath) {
List<Buff> buffs = new ArrayList<Buff>(creature.getBuffList().get());
List<Buff> buffs = new ArrayList<Buff>(creature.getBuffList().values());
buffs.stream().filter(Buff::isDecayOnPvPDeath).forEach(Buff::incDecayCounter);
creature.updateAllBuffs();
}
@@ -686,9 +687,9 @@ public class PlayerService implements INetworkDispatch {
SWGObject inventory = creature.getSlottedObject("inventory");
try {
for (Long equipmentId : new ArrayList<Long>(creature.getEquipmentList())) {
for (Equipment equipmentObject : new ArrayList<Equipment>(creature.getEquipmentList())) {
SWGObject equipment = core.objectService.getObject(equipmentId);
SWGObject equipment = core.objectService.getObject(equipmentObject.getObjectId());
if (equipment == null || equipment.getTemplate().startsWith("object/tangible/hair/")) {
continue;
@@ -714,7 +715,7 @@ public class PlayerService implements INetworkDispatch {
//core.equipmentService.unequip(creature, equipment);
//}
for (Buff buff : creature.getBuffList().get().toArray(new Buff[] { })) {
for (Buff buff : creature.getBuffList().values().toArray(new Buff[] { })) {
if (buff.isRemoveOnRespec()) {
core.buffService.removeBuffFromCreature(creature, buff);
}
@@ -749,7 +750,7 @@ public class PlayerService implements INetworkDispatch {
String xpType = ((player.getProfession().contains("entertainer")) ? "entertainer" : ((player.getProfession().contains("trader")) ? "crafting" : "combat_general"));
player.setXp(xpType, 0);
creature.setXpBarValue(0);
creature.setDisplayXp(0);
player.setProfessionWheelPosition("");
@@ -804,7 +805,7 @@ public class PlayerService implements INetworkDispatch {
String xpType = ((player.getProfession().contains("entertainer")) ? "entertainer" : ((player.getProfession().contains("trader")) ? "crafting" : "combat_general"));
player.setXp(xpType, experience);
creature.setXpBarValue(experience);
creature.setDisplayXp(experience);
// 2. Add the relevant health/action and expertise points.
@@ -989,7 +990,7 @@ public class PlayerService implements INetworkDispatch {
experience += ((experience * experienceBonus) / 100);
// 1. Add the experience.
if (experience > 0 && !creature.isStationary()) {
if (experience > 0 && !creature.isPerforming()) {
creature.showFlyText(OutOfBand.ProsePackage("@base_player:prose_flytext_xp", experience), 2.5f, new RGB(180, 60, 240), 1, true);
}
@@ -1000,7 +1001,7 @@ public class PlayerService implements INetworkDispatch {
}
player.setXp(xpType, experience);
creature.setXpBarValue(experience);
creature.setDisplayXp(experience);
// 2. See if they need to level up.
for (int i = 0; i < experienceTable.getRowCount(); i++) {
@@ -1378,8 +1379,8 @@ public class PlayerService implements INetworkDispatch {
actor.sendSystemMessage("@unity:decline", (byte) 0);
proposer.sendSystemMessage("@unity:declined", (byte) 0);
actor.setAttachment("proposer", null);
for(Long objId : proposer.getEquipmentList()) {
SWGObject obj = core.objectService.getObject(objId);
for(Equipment equipment : proposer.getEquipmentList()) {
SWGObject obj = core.objectService.getObject(equipment.getObjectId());
if(obj != null && obj.getAttachment("unity") != null) {
obj.setAttachment("unity", null);
break;
+1 -1
View File
@@ -407,7 +407,7 @@ public class SkillService implements INetworkDispatch {
List<String> skills = new ArrayList<String>(creature.getSkills());
skills.stream().filter(s -> s.contains("expertise")).forEach(s -> removeSkill(creature, s));
creature.getBuffList().stream().forEach(buff -> creature.removeBuff(buff));
creature.getBuffList().values().stream().forEach(buff -> creature.removeBuff(buff));
}
public void sendRespecWindow(CreatureObject creature) {
-1
View File
@@ -37,7 +37,6 @@ import resources.harvest.SurveyTool;
import resources.objects.creature.CreatureObject;
import resources.objects.player.PlayerObject;
import resources.objects.resource.GalacticResource;
import resources.objects.resource.ResourceConcentration;
import resources.objects.resource.ResourceContainerObject;
import resources.objects.resource.ResourceRoot;
import resources.objects.tangible.TangibleObject;
+6 -6
View File
@@ -135,8 +135,8 @@ public class AIActor {
if (obj instanceof CreatureObject){
CreatureObject addedObject = (CreatureObject) obj;
if (addedObject.getCalledPet()!=null){
CreatureObject calledPet = addedObject.getCalledPet();
if (NGECore.getInstance().objectService.getObject(addedObject.getPlayerObject().getPet())!=null){
CreatureObject calledPet = (CreatureObject) NGECore.getInstance().objectService.getObject(addedObject.getPlayerObject().getPet());
if (calledPet.getPosture() != 13 && calledPet.getPosture() != 14){
addDefender(calledPet);
}
@@ -167,8 +167,8 @@ public class AIActor {
DevLog.debugout("Charon", "CHECK isFactionEnemy", "res " + NGECore.getInstance().factionService.isFactionEnemy((TangibleObject)creature, (TangibleObject)obj));
if (obj instanceof CreatureObject && NGECore.getInstance().factionService.isFactionEnemy((TangibleObject)creature, (TangibleObject)obj)){
CreatureObject addedObject = (CreatureObject) obj;
if (addedObject.getCalledPet()!=null){
CreatureObject calledPet = addedObject.getCalledPet();
if (NGECore.getInstance().objectService.getObject(addedObject.getPlayerObject().getPet())!=null){
CreatureObject calledPet = (CreatureObject) NGECore.getInstance().objectService.getObject(addedObject.getPlayerObject().getPet());
if (calledPet.getPosture() != 13 && calledPet.getPosture() != 14){
addDefender(calledPet);
}
@@ -191,8 +191,8 @@ public class AIActor {
DevLog.debugout("Charon", "CHECK isFactionEnemy", "res " + NGECore.getInstance().factionService.isFactionEnemy((TangibleObject)creature, (TangibleObject)obj));
if (obj instanceof CreatureObject && NGECore.getInstance().factionService.isFactionEnemy((TangibleObject)creature, (TangibleObject)obj)){
CreatureObject addedObject = (CreatureObject) obj;
if (addedObject.getCalledPet()!=null){
CreatureObject calledPet = addedObject.getCalledPet();
if (NGECore.getInstance().objectService.getObject(addedObject.getPlayerObject().getPet())!=null){
CreatureObject calledPet = (CreatureObject) NGECore.getInstance().objectService.getObject(addedObject.getPlayerObject().getPet());
if (calledPet.getPosture() != 13 && calledPet.getPosture() != 14){
addDefender(calledPet);
}
+1 -1
View File
@@ -121,7 +121,7 @@ public class LairActor {
break;
case 3:
if (bossTemplate!=null && ! bossSpawned){
CreatureObject boss = (CreatureObject)NGECore.getInstance().spawnService.spawnCreature(bossTemplate, lairObject.getPlanet().getName(), 0L, lairObject.getPosition().x + 3, lairObject.getPosition().y, lairObject.getPosition().z, lairObject.getOrientation().w, lairObject.getOrientation().x, lairObject.getOrientation().y,lairObject.getOrientation().z,-1);
//CreatureObject boss = (CreatureObject)NGECore.getInstance().spawnService.spawnCreature(bossTemplate, lairObject.getPlanet().getName(), 0L, lairObject.getPosition().x + 3, lairObject.getPosition().y, lairObject.getPosition().z, lairObject.getOrientation().w, lairObject.getOrientation().x, lairObject.getOrientation().y,lairObject.getOrientation().z,-1);
bossSpawned = true;
}
return;
+1 -1
View File
@@ -145,7 +145,7 @@ public class AttackState extends AIState {
actor.scheduleRecovery();
return StateResult.UNFINISHED;
}
if(target.getPosture() == 13 || target.getPosture() == 14 || target.isInStealth()) {
if(target.getPosture() == 13 || target.getPosture() == 14 || target.isCloaked()) {
actor.setFollowObject(actor.getHighestDamageDealer());
target = actor.getFollowObject();
+7 -7
View File
@@ -323,8 +323,8 @@ public class CombatService implements INetworkDispatch {
if (target instanceof CreatureObject){
CreatureObject targetCreature = (CreatureObject)target;
if (targetCreature.getCalledPet()!=null) {
AIActor petActor = (AIActor) targetCreature.getCalledPet().getAttachment("AI");
if (core.objectService.getObject(targetCreature.getPlayerObject().getPet())!=null) {
AIActor petActor = (AIActor) core.objectService.getObject(targetCreature.getPlayerObject().getPet()).getAttachment("AI");
if (petActor!=null){
petActor.addDefender(attacker);
DevLog.debugout("Charon", "Pet AI", "applyDamage addDefender");
@@ -550,11 +550,11 @@ public class CombatService implements INetworkDispatch {
private boolean attemptCombat(CreatureObject attacker, TangibleObject target) {
if (attacker.isInStealth()) {
attacker.setInStealth(false);
if (attacker.isCloaked()) {
attacker.setCloaked(false);
if (attacker.getPlayerObject() != null && attacker.getPlayerObject().getProfession().equals("spy_1a")) {
attacker.setRadarVisible(true);
attacker.setVisibleOnRadar(true);
}
}
@@ -912,8 +912,8 @@ public class CombatService implements INetworkDispatch {
if (target instanceof CreatureObject){
CreatureObject targetCreature = (CreatureObject)target;
if (targetCreature.getCalledPet()!=null) {
AIActor petActor = (AIActor) targetCreature.getCalledPet().getAttachment("AI");
if (core.objectService.getObject(targetCreature.getPlayerObject().getPet())!=null) {
AIActor petActor = (AIActor) core.objectService.getObject(targetCreature.getPlayerObject().getPet()).getAttachment("AI");
if (petActor!=null){
petActor.addDefender(attacker);
DevLog.debugout("Charon", "Pet AI", "applyDamage addDefender");
+3 -2
View File
@@ -29,6 +29,7 @@ import org.python.core.Py;
import org.python.core.PyObject;
import engine.resources.objects.SWGObject;
import resources.equipment.Equipment;
import resources.objects.creature.CreatureObject;
public class BonusSetTemplate
@@ -55,9 +56,9 @@ public class BonusSetTemplate
public int getWornTemplateCount(CreatureObject creature)
{
int wornItems = 0;
for (Long itemId : creature.getEquipmentList().get())
for (Equipment equipment : creature.getEquipmentList().get())
{
SWGObject item = NGECore.getInstance().objectService.getObject(itemId);
SWGObject item = NGECore.getInstance().objectService.getObject(equipment.getObjectId());
if(item == null)
continue;
if(requiredWornItems.contains(item.getTemplate()) || requiredWornItems.contains(item.getStfName())) wornItems++;
+3 -2
View File
@@ -39,6 +39,7 @@ import org.python.core.Py;
import org.python.core.PyObject;
import resources.datatables.FactionStatus;
import resources.equipment.Equipment;
import resources.objects.creature.CreatureObject;
import main.NGECore;
import engine.resources.container.Traverser;
@@ -319,9 +320,9 @@ public class EquipmentService implements INetworkDispatch {
int wornArmourPieces = 0, forceProtection = 0;
Map<String, Float> protection = new TreeMap<String, Float>();
for(Long itemId : new ArrayList<Long>(creature.getEquipmentList()))
for(Equipment equipment : new ArrayList<Equipment>(creature.getEquipmentList()))
{
SWGObject item = core.objectService.getObject(itemId);
SWGObject item = core.objectService.getObject(equipment.getObjectId());
if(item == null)
continue;
Map<String, Object> attributes = new TreeMap<String, Object>(item.getAttributes());
+2 -2
View File
@@ -897,8 +897,8 @@ public class HousingService implements INetworkDispatch {
// possibly sending the same delta multiple times
if (((CreatureObject) owner).getLookAtTarget() != itemList.get(i).getObjectID());
((CreatureObject)owner).setLookAtTarget(itemList.get(i).getObjectID());
if (((CreatureObject) owner).getTargetId() != itemList.get(i).getObjectID());
((CreatureObject)owner).setTargetId(itemList.get(i).getObjectID());
if (((CreatureObject) owner).getIntendedTarget() != itemList.get(i).getObjectID());
((CreatureObject)owner).setIntendedTarget(itemList.get(i).getObjectID());
if (((CreatureObject) owner).getIntendedTarget() != itemList.get(i).getObjectID());
((CreatureObject)owner).setIntendedTarget(itemList.get(i).getObjectID());
}
+1 -1
View File
@@ -438,7 +438,7 @@ public class MountService implements INetworkDispatch {
return;
}
if (rider.isInStealth()) {
if (rider.isCloaked()) {
rider.sendSystemMessage(OutOfBand.ProsePackage("@pet/pet_menu:no_mount_stealth"), DisplayType.Broadcast);
return;
}
+7 -7
View File
@@ -135,7 +135,7 @@ public class PetService implements INetworkDispatch {
}
pet.setOwnerId(actor.getObjectID());
actor.setCalledPet(pet);
actor.getPlayerObject().setPet(pet.getObjectID());
pcd.setAttachment("companion_RefId", pet.getObjectID());
@@ -450,7 +450,7 @@ public class PetService implements INetworkDispatch {
return;
}
if (rider.isInStealth()) {
if (rider.isCloaked()) {
rider.sendSystemMessage(OutOfBand.ProsePackage("@pet/pet_menu:no_mount_stealth"), DisplayType.Broadcast);
return;
}
@@ -763,7 +763,7 @@ public class PetService implements INetworkDispatch {
AIActor aiActor = (AIActor) mount.getAttachment("AI");
aiActor.destroyActor();
player.setPet(0L);
owner.setCalledPet(null);
owner.getPlayerObject().setPet(0);
core.objectService.destroyObject((Long) pcd.getAttachment("companion_RefId"));
pcd.setAttachment("companion_RefId", null);
}
@@ -796,7 +796,7 @@ public class PetService implements INetworkDispatch {
AIActor aiActor = (AIActor) pet.getAttachment("AI");
aiActor.destroyActor();
actor.setCalledPet(null);
actor.getPlayerObject().setPet(0);
core.objectService.destroyObject(petId);
pcd.setAttachment("companion_RefId",null);
@@ -919,7 +919,7 @@ public class PetService implements INetworkDispatch {
public void tame(CreatureObject actor, CreatureObject target) {
DevLog.debugout("Charon", "Pet AI", "Tame called.");
if (actor.getCalledPet()!=null){
if (core.objectService.getObject(actor.getPlayerObject().getPet())!=null){
actor.sendSystemMessage(OutOfBand.ProsePackage("@pet/pet_menu:too_many"), DisplayType.Broadcast);
return;
}
@@ -989,11 +989,11 @@ public class PetService implements INetworkDispatch {
datapad.add(pcd);
if (target.getOption(Options.AGGRESSIVE))
target.removeOption(Options.AGGRESSIVE);
target.setOptions(Options.AGGRESSIVE, false);
target.setAttachment("tamed", 1);
actor.setCalledPet(target);
actor.getPlayerObject().setPet(target.getObjectID());
target.setFaction(actor.getFaction());
target.setFactionStatus(actor.getFactionStatus());
target.setOwnerId(actor.getObjectID());