|
|
|
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
|
|
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
|
|
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
|
|
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
|
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
|
|
// Magicbane Emulator Project © 2013 - 2022
|
|
|
|
// www.magicbane.com
|
|
|
|
|
|
|
|
|
|
|
|
package engine.net.client.msg;
|
|
|
|
|
|
|
|
import engine.Enum.GameObjectType;
|
|
|
|
import engine.math.Vector3fImmutable;
|
|
|
|
import engine.net.AbstractConnection;
|
|
|
|
import engine.net.ByteBufferReader;
|
|
|
|
import engine.net.ByteBufferWriter;
|
|
|
|
import engine.net.client.Protocol;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
|
|
|
public class OrderNPCMsg extends ClientNetMsg {
|
|
|
|
|
|
|
|
// 2 = manage this asset. 20 = manage entire city
|
|
|
|
private int objectType;
|
|
|
|
private int npcUUID;
|
|
|
|
private int buildingUUID;
|
|
|
|
private int unknown02;
|
|
|
|
private ArrayList<Vector3fImmutable> patrolPoints;
|
|
|
|
private ArrayList<Vector3fImmutable> sentryPoints;
|
|
|
|
private int patrolSize;
|
|
|
|
private int sentrySize;
|
|
|
|
|
|
|
|
private int actionType;
|
|
|
|
private float buySellPercent;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This is the general purpose constructor
|
|
|
|
*/
|
|
|
|
public OrderNPCMsg() {
|
|
|
|
super(Protocol.ORDERNPC);
|
|
|
|
this.actionType = 0;
|
|
|
|
this.unknown02 = 0;
|
|
|
|
this.npcUUID = 0;
|
|
|
|
this.buildingUUID = 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This constructor is used by NetMsgFactory. It attempts to deserialize the
|
|
|
|
* ByteBuffer into a message. If a BufferUnderflow occurs (based on reading
|
|
|
|
* past the limit) then this constructor Throws that Exception to the
|
|
|
|
* caller.
|
|
|
|
*/
|
|
|
|
public OrderNPCMsg(AbstractConnection origin, ByteBufferReader reader) {
|
|
|
|
super(Protocol.ORDERNPC, origin, reader);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Deserializes the subclass specific items to the supplied NetMsgWriter.
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
protected void _deserialize(ByteBufferReader reader) {
|
|
|
|
actionType = reader.getInt();
|
|
|
|
if (this.actionType == 28) {
|
|
|
|
this.handleCityCommand(reader);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
unknown02 = reader.getInt();
|
|
|
|
this.objectType = reader.getInt(); // Object Type Padding
|
|
|
|
npcUUID = reader.getInt();
|
|
|
|
reader.getInt(); // Object Type Padding
|
|
|
|
buildingUUID = reader.getInt();
|
|
|
|
this.buySellPercent = reader.getFloat();
|
|
|
|
if (actionType > 6 && actionType < 13)
|
|
|
|
reader.getInt();
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Serializes the subclass specific items from the supplied NetMsgReader.
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
protected void _serialize(ByteBufferWriter writer) {
|
|
|
|
writer.putInt(actionType);
|
|
|
|
writer.putInt(unknown02);
|
|
|
|
writer.putInt(GameObjectType.NPC.ordinal());
|
|
|
|
writer.putInt(npcUUID);
|
|
|
|
writer.putInt(GameObjectType.Building.ordinal());
|
|
|
|
writer.putInt(buildingUUID);
|
|
|
|
writer.putFloat(this.buySellPercent);
|
|
|
|
writer.putInt(0);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
private void handleCityCommand(ByteBufferReader reader) {
|
|
|
|
reader.getInt();
|
|
|
|
reader.getInt();
|
|
|
|
reader.getInt();
|
|
|
|
reader.getInt();
|
|
|
|
this.buildingUUID = reader.getInt();
|
|
|
|
reader.get();
|
|
|
|
reader.get();
|
|
|
|
reader.getInt();
|
|
|
|
patrolSize = reader.getInt();
|
|
|
|
if (patrolSize > 0) {
|
|
|
|
this.patrolPoints = new ArrayList<>();
|
|
|
|
for (int i = 0; i < patrolSize; i++) {
|
|
|
|
float x = reader.getFloat();
|
|
|
|
float y = reader.getFloat();
|
|
|
|
float z = reader.getFloat();
|
|
|
|
if (this.patrolPoints.size() < 4)
|
|
|
|
this.patrolPoints.add(new Vector3fImmutable(x, y, z));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sentrySize = reader.getInt();
|
|
|
|
if (sentrySize > 0) {
|
|
|
|
this.sentryPoints = new ArrayList<>();
|
|
|
|
for (int i = 0; i < sentrySize; i++) {
|
|
|
|
float x = reader.getFloat();
|
|
|
|
float y = reader.getFloat();
|
|
|
|
float z = reader.getFloat();
|
|
|
|
if (this.sentryPoints.size() < 4)
|
|
|
|
this.sentryPoints.add(new Vector3fImmutable(x, y, z));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
reader.getInt();
|
|
|
|
reader.getInt();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return the npcUUID
|
|
|
|
*/
|
|
|
|
public int getNpcUUID() {
|
|
|
|
return npcUUID;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public int getActionType() {
|
|
|
|
return actionType;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public int getBuildingUUID() {
|
|
|
|
return buildingUUID;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param buildingUUID the buildingUUID to set
|
|
|
|
*/
|
|
|
|
public void setBuildingUUID(int buildingUUID) {
|
|
|
|
this.buildingUUID = buildingUUID;
|
|
|
|
}
|
|
|
|
|
|
|
|
public float getBuySellPercent() {
|
|
|
|
return buySellPercent;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setBuySellPercent(float buySellPercent) {
|
|
|
|
this.buySellPercent = buySellPercent;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getObjectType() {
|
|
|
|
return objectType;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setObjectType(int objectType) {
|
|
|
|
this.objectType = objectType;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ArrayList<Vector3fImmutable> getPatrolPoints() {
|
|
|
|
return patrolPoints;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ArrayList<Vector3fImmutable> getSentryPoints() {
|
|
|
|
return sentryPoints;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getPatrolSize() {
|
|
|
|
return patrolSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setPatrolSize(int patrolSize) {
|
|
|
|
this.patrolSize = patrolSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getSentrySize() {
|
|
|
|
return sentrySize;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setSentrySize(int sentrySize) {
|
|
|
|
this.sentrySize = sentrySize;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//Debug Info
|
|
|
|
//Run: Failed to make object TEMPLATE:135700 INSTANCE:1717987027141... (t=50.46) (r=7/4/2011 11:56:39)
|
|
|
|
//C:\ArcanePrime\Main_Branch\Shadowbane\Source\ArcObjectLoader.cpp(466):ERROR: ArcObjectLoader::Run: Failed to make object TEMPLATE:108760 INSTANCE:1717987027161... (t=50.46) (r=7/4/2011 11:56:39)
|
|
|
|
//C:\ArcanePrime\Main_Branch\Shadowbane\Source\ArcObjectLoader.cpp(466):ERROR: ArcObjectLoader::Run: Failed to make object TEMPLATE:108760 INSTANCE:1717987027177... (t=50.67) (r=7/4/2011 11:56:39)
|
|
|
|
//C:\ArcanePrime\Main_Branch\Shadowbane\Source\ArcObjectLoader.cpp(466):ERROR: ArcObjectLoader::Run: Failed to make object TEMPLATE:60040 INSTANCE:1717987027344... (t=50.87) (r=7/4/2011 11:56:39)
|
|
|
|
//C:\ArcanePrime\Main_Branch\Shadowbane\Source\ArcObjectLoader.cpp(466):ERROR: ArcObjectLoader::Run: Failed to make object TEMPLATE:3 INSTANCE:1717987027164... (t=50.88) (r=7/4/2011 11:56:39)
|
|
|
|
|