Begun reimplementing the whole actor system to follow more closely to the client side's system. Packet processor's reference chanced, and all ActorID vars in Actor class were changed to ActorId.

This commit is contained in:
Filip Maj 2016-01-02 14:04:45 -05:00
parent 67ee70e7c5
commit 04faf9d753
20 changed files with 582 additions and 269 deletions

View file

@ -1,162 +0,0 @@
using FFXIVClassic_Lobby_Server;
using FFXIVClassic_Lobby_Server.common;
using FFXIVClassic_Lobby_Server.dataobjects;
using FFXIVClassic_Lobby_Server.packets;
using FFXIVClassic_Map_Server.dataobjects.chara;
using FFXIVClassic_Map_Server.packets.send.actor;
using FFXIVClassic_Map_Server.packets.send.Actor;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
namespace FFXIVClassic_Map_Server.dataobjects
{
class Actor
{
public const int SIZE = 0;
public const int COLORINFO = 1;
public const int FACEINFO = 2;
public const int HIGHLIGHT_HAIR = 3;
public const int VOICE = 4;
public const int WEAPON1 = 5;
public const int WEAPON2 = 6;
public const int WEAPON3 = 7;
public const int UNKNOWN1 = 8;
public const int UNKNOWN2 = 9;
public const int UNKNOWN3 = 10;
public const int UNKNOWN4 = 11;
public const int HEADGEAR = 12;
public const int BODYGEAR = 13;
public const int LEGSGEAR = 14;
public const int HANDSGEAR = 15;
public const int FEETGEAR = 16;
public const int WAISTGEAR = 17;
public const int UNKNOWN5 = 18;
public const int R_EAR = 19;
public const int L_EAR = 20;
public const int UNKNOWN6 = 21;
public const int UNKNOWN7 = 22;
public const int R_FINGER = 23;
public const int L_FINGER = 24;
public uint actorID;
public CharaWork charaWork = new CharaWork();
public PlayerWork playerWork = new PlayerWork();
public uint displayNameID = 0xFFFFFFFF;
public string customDisplayName;
public uint modelID;
public uint[] appearanceIDs = new uint[0x1D];
public uint currentTarget = 0xC0000000;
public uint currentLockedTarget = 0xC0000000;
public float positionX, positionY, positionZ, rotation;
public float oldPositionX, oldPositionY, oldPositionZ, oldRotation;
public ushort moveState, oldMoveState;
public uint currentState = SetActorStatePacket.STATE_PASSIVE;
public uint currentZoneID;
public Actor(uint id)
{
actorID = id;
}
public SubPacket createNamePacket(uint playerActorID)
{
return SetActorNamePacket.buildPacket(actorID, playerActorID, displayNameID, displayNameID == 0xFFFFFFFF ? customDisplayName : "");
}
public SubPacket createAppearancePacket(uint playerActorID)
{
SetActorAppearancePacket setappearance = new SetActorAppearancePacket(modelID, appearanceIDs);
return setappearance.buildPacket(actorID, playerActorID);
}
public SubPacket createStatePacket(uint playerActorID)
{
return SetActorStatePacket.buildPacket(actorID, playerActorID, currentState);
}
public SubPacket createSpeedPacket(uint playerActorID)
{
return SetActorSpeedPacket.buildPacket(actorID, playerActorID);
}
public SubPacket createSpawnPositonPacket(uint playerActorID, uint spawnType)
{
return SetActorPositionPacket.buildPacket(actorID, playerActorID, SetActorPositionPacket.INNPOS_X, SetActorPositionPacket.INNPOS_Y, SetActorPositionPacket.INNPOS_Z, SetActorPositionPacket.INNPOS_ROT, SetActorPositionPacket.SPAWNTYPE_PLAYERWAKE);
//return SetActorPositionPacket.buildPacket(actorID, playerActorID, -211.895477f, 190.000000f, 29.651011f, 2.674819f, SetActorPositionPacket.SPAWNTYPE_PLAYERWAKE);
}
public SubPacket createPositionUpdatePacket(uint playerActorID)
{
return MoveActorToPositionPacket.buildPacket(actorID, playerActorID, positionX, positionY, positionZ, rotation, moveState);
}
public SubPacket createScriptBindPacket(uint playerActorID)
{
return null;
}
public BasePacket createActorSpawnPackets(uint playerActorID)
{
List<SubPacket> subpackets = new List<SubPacket>();
subpackets.Add(createSpeedPacket(playerActorID));
subpackets.Add(createSpawnPositonPacket(playerActorID, 0xFF));
subpackets.Add(createAppearancePacket(playerActorID));
subpackets.Add(createNamePacket(playerActorID));
subpackets.Add(_0xFPacket.buildPacket(playerActorID, playerActorID));
subpackets.Add(createStatePacket(playerActorID));
//subpackets.Add(createScriptBindPacket(playerActorID));
return BasePacket.createPacket(subpackets, true, false);
}
public List<SubPacket> createInitSubpackets(uint playerActorID)
{
List<SubPacket> subpacketList = new List<SubPacket>();
SetActorPropetyPacket setProperty = new SetActorPropetyPacket();
setProperty.addByte(0x0DB5A5BF, 5);
setProperty.addProperty(this, "charaWork.battleSave.potencial");
setProperty.addProperty(this, "charaWork.property[0]");
setProperty.addProperty(this, "charaWork.property[1]");
setProperty.addProperty(this, "charaWork.property[2]");
setProperty.addProperty(this, "charaWork.property[4]");
setProperty.addProperty(this, "charaWork.parameterSave.hp[0]");
setProperty.addProperty(this, "charaWork.parameterSave.hpMax[0]");
setProperty.addProperty(this, "charaWork.parameterSave.mp");
setProperty.addProperty(this, "charaWork.parameterSave.mpMax");
setProperty.addProperty(this, "charaWork.parameterTemp.tp");
setProperty.addProperty(this, "charaWork.parameterSave.state_mainSkill[0]");
setProperty.addProperty(this, "charaWork.parameterSave.state_mainSkillLevel");
setProperty.addProperty(this, "charaWork.depictionJudge");
setProperty.addProperty(this, "charaWork.statusShownTime[0]");
setProperty.setTarget("/_init");
subpacketList.Add(setProperty.buildPacket(actorID, playerActorID));
return subpacketList;
}
public override bool Equals(Object obj)
{
Actor actorObj = obj as Actor;
if (actorObj == null)
return false;
else
return actorID == actorObj.actorID;
}
}
}

View file

@ -14,8 +14,11 @@ namespace FFXIVClassic_Map_Server.dataobjects
class ConnectedPlayer
{
public uint actorID = 0;
PlayerActor playerActor;
List<Actor> actorInstanceList = new List<Actor>();
Player playerActor;
public List<Actor> actorInstanceList = new List<Actor>();
public uint eventCurrentOwner = 0;
public string eventCurrentStarter = "";
ClientConnection conn1;
ClientConnection conn2;
@ -71,16 +74,26 @@ namespace FFXIVClassic_Map_Server.dataobjects
return conn2;
}
public Actor getActor()
public void queuePacket(BasePacket basePacket)
{
conn1.queuePacket(basePacket);
}
public void queuePacket(SubPacket subPacket, bool isAuthed, bool isEncrypted)
{
conn1.queuePacket(subPacket, isAuthed, isEncrypted);
}
public Player getActor()
{
return playerActor;
}
public void createPlayerActor(uint actorId, DBCharacter chara)
{
playerActor = new PlayerActor(actorId);
playerActor = new Player(actorId);
playerActor.displayNameID = 0xFFFFFFFF;
playerActor.displayNameId = 0xFFFFFFFF;
playerActor.customDisplayName = chara.name;
playerActor.setPlayerAppearance();
actorInstanceList.Add(playerActor);
@ -106,7 +119,6 @@ namespace FFXIVClassic_Map_Server.dataobjects
}
public List<BasePacket> updateInstance(List<Actor> list)
{
List<BasePacket> basePackets = new List<BasePacket>();
@ -116,17 +128,17 @@ namespace FFXIVClassic_Map_Server.dataobjects
{
Actor actor = list[i];
if (actor.actorID == playerActor.actorID)
if (actor.actorId == playerActor.actorId)
continue;
if (actorInstanceList.Contains(actor))
{
posUpdateSubpackets.Add(actor.createPositionUpdatePacket(playerActor.actorID));
posUpdateSubpackets.Add(actor.createPositionUpdatePacket(playerActor.actorId));
}
else
{
BasePacket p = actor.createActorSpawnPackets(playerActor.actorID);
p.replaceActorID(0x29b27d3, playerActor.actorID);
BasePacket p = actor.createActorSpawnPackets(playerActor.actorId);
p.replaceActorID(playerActor.actorId);
basePackets.Add(p);
actorInstanceList.Add(actor);
}
@ -137,5 +149,6 @@ namespace FFXIVClassic_Map_Server.dataobjects
return basePackets;
}
}
}

View file

@ -1,20 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FFXIVClassic_Map_Server.dataobjects.chara
{
class BattleSave
{
public float potencial;
public int skillLevel;
public int skillLevelCap;
public int[] skillPoint;
public int physicalExp;
public bool[] negotiationFlag= new bool[2];
}
}

View file

@ -1,45 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FFXIVClassic_Map_Server.dataobjects.chara
{
class BattleTemp
{
//These are known property IDs
public const uint NAMEPLATE_SHOWN = 0xFBFBCFB1;
public const uint TARGETABLE = 0x2138FD71;
public const uint STAT_STRENGTH = 0x647A29A8;
public const uint STAT_VITALITY = 0x939E884A;
public const uint STAT_DEXTERITY = 0x416571AC;
public const uint STAT_INTELLIGENCE = 0x2DFBC13A;
public const uint STAT_MIND = 0x0E704141;
public const uint STAT_PIETY = 0x6CCAF8B3;
public const uint STAT_ACCURACY = 0x91CD44E7;
public const uint STAT_EVASION = 0x11B1B22D;
public const uint STAT_ATTACK = 0xBA51C4E1;
public const uint STAT_DEFENSE = 0x8CAE90DB;
public const uint STAT_ATTACK_MAGIC_POTENCY = 0x1F3DACC5;
public const uint STAT_HEALING_MAGIC_POTENCY = 0xA329599A;
public const uint STAT_ENCHANCEMENT_MAGIC_POTENCY = 0xBA51C4E1;
public const uint STAT_ENFEEBLING_MAGIC_POTENCY = 0xEB90BAAB;
public const uint STAT_MAGIC_ACCURACY = 0xD57DC284;
public const uint STAT_MAGIC_EVASION = 0x17AB37EF;
public const uint RESISTANCE_FIRE = 0x79C7ECFF;
public const uint RESISTANCE_ICE = 0xE17D8C7A;
public const uint RESISTANCE_WIND = 0x204CF942;
public const uint RESISTANCE_LIGHTNING = 0x1C2AEC73;
public const uint RESISTANCE_EARTH = 0x5FC56D16;
public const uint RESISTANCE_WATER = 0x64803E98;
//End of properties
public int[] castGauge_speed = new int[2];
public bool[] timingCommandFlag = new bool[4];
public ushort[] generalParameter = new ushort[32];
}
}

View file

@ -1,30 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FFXIVClassic_Map_Server.dataobjects.chara
{
class CharaWork
{
public ParameterSave parameterSave = new ParameterSave();
public ParameterTemp parameterTemp = new ParameterTemp();
public BattleSave battleSave = new BattleSave();
public BattleTemp battleTemp = new BattleTemp();
public EventSave eventSave = new EventSave();
public EventTemp eventTemp = new EventTemp();
public byte[] property = new byte[32];
public uint[] statusShownTime = new uint[20];
public int[] command = new int[64];
public int[] commandCategory = new int[64];
public int commandBorder = 0x20;
public bool commandAcquired = false;
public bool[] additionalCommandAcquired = new bool[1];
public uint depictionJudge = 0xa0f50911;
}
}

View file

@ -1,15 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FFXIVClassic_Map_Server.dataobjects.chara
{
class EventSave
{
public bool bazaar;
public float bazaarTax;
public int repairType;
}
}

View file

@ -1,17 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FFXIVClassic_Map_Server.dataobjects.chara
{
class EventTemp
{
public bool bazaarRetail = false;
public bool bazaarRepair = false;
public bool bazaarMateria = false;
public ushort[] linshellIcon = new ushort[4];
}
}

View file

@ -1,26 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FFXIVClassic_Map_Server.dataobjects.chara
{
class ParameterSave
{
public int[] hp = new int[1];
public int[] hpMax = new int[1];
public int mp;
public int mpMax;
public int[] state_mainSkill = new int[4];
public int state_mainSkillLevel;
public int[] state_boostPointForSkill;
public int[] commandSlot_compatibility;
public int[] commandSlot_recastTime;
public int[] giftCommandSlot_commandId;
}
}

View file

@ -1,23 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FFXIVClassic_Map_Server.dataobjects.chara
{
class ParameterTemp
{
public int tp = 0;
public int targetInformation = 0;
public int[] maxCommandRecastTime = new int[40];
public float[] forceControl_float_forClientSelf = new float[4];
public short[] forceControl_int16_forClientSelf = new short[2];
public int[] otherClassAbilityCount = new int[2];
public int[] giftCount = new int[2];
}
}

View file

@ -1,70 +0,0 @@
using FFXIVClassic_Lobby_Server;
using FFXIVClassic_Lobby_Server.common;
using FFXIVClassic_Lobby_Server.dataobjects;
using FFXIVClassic_Map_Server.dataobjects.database;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FFXIVClassic_Map_Server.dataobjects.chara
{
class PlayerActor : Actor
{
public PlayerActor(uint actorID) : base(actorID)
{
DBStats stats = Database.getCharacterStats(actorID);
charaWork.property[0] = 1;
charaWork.property[1] = 1;
charaWork.property[2] = 1;
charaWork.property[4] = 1;
charaWork.parameterSave.hp[0] = stats.hp;
charaWork.parameterSave.hpMax[0] = stats.hpMax;
charaWork.parameterSave.mp = stats.mp;
charaWork.parameterSave.mpMax = stats.mpMax;
charaWork.parameterSave.state_mainSkill[0] = 3;
charaWork.parameterSave.state_mainSkillLevel = 1;
charaWork.battleSave.skillLevel = 1;
charaWork.battleSave.skillLevelCap = 2;
charaWork.battleSave.potencial = 0.5f;
charaWork.battleSave.physicalExp = 1;
charaWork.battleSave.negotiationFlag[0] = false;
charaWork.battleSave.negotiationFlag[1] = false;
for (int i = 0; i < 20; i++)
charaWork.statusShownTime[i] = 0xFFFFFFFF;
setPlayerAppearance();
}
public void setPlayerAppearance()
{
DBAppearance appearance = Database.getAppearance(actorID);
modelID = DBAppearance.getTribeModel(appearance.tribe);
appearanceIDs[SIZE] = appearance.size;
appearanceIDs[COLORINFO] = (uint)(appearance.skinColor | (appearance.hairColor << 10) | (appearance.eyeColor << 20));
appearanceIDs[FACEINFO] = PrimitiveConversion.ToUInt32(appearance.getFaceInfo());
appearanceIDs[HIGHLIGHT_HAIR] = (uint)(appearance.hairHighlightColor | appearance.hairStyle << 10);
appearanceIDs[VOICE] = appearance.voice;
appearanceIDs[WEAPON1] = appearance.mainHand;
appearanceIDs[WEAPON2] = appearance.offHand;
appearanceIDs[HEADGEAR] = appearance.head;
appearanceIDs[BODYGEAR] = appearance.body;
appearanceIDs[LEGSGEAR] = appearance.legs;
appearanceIDs[HANDSGEAR] = appearance.hands;
appearanceIDs[FEETGEAR] = appearance.feet;
appearanceIDs[WAISTGEAR] = appearance.waist;
appearanceIDs[R_EAR] = appearance.rightEar;
appearanceIDs[L_EAR] = appearance.leftEar;
appearanceIDs[R_FINGER] = appearance.rightFinger;
appearanceIDs[L_FINGER] = appearance.leftFinger;
}
}
}

View file

@ -1,51 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FFXIVClassic_Map_Server.dataobjects.chara
{
class PlayerWork
{
public int tribe;
public int guardian;
public int birthdayMonth;
public int birthdayDay;
public int initialTown;
public int restBonusExpRate;
public int[] questScenario = new int[16];
public int[] questGuildLeve = new int[8];
public int questScenarioComplete;
public int questGuildleveComplete;
public bool isContentsCommand;
public int castCommandClient;
public int castEndClient;
public int[] comboNextCommandId = new int[2];
public int comboCostBonusRate;
public bool isRemainBonusPoint;
public int[] npcLinkshellChatCalling = new int[64];
public int[] npcLinkshellChatExtra = new int[64];
public int variableCommandConfirmWarp;
public int variableCommandConfirmWarpSender;
public int variableCommandConfirmWarpSenderByID;
public int variableCommandConfirmWarpSenderSex;
public int variableCommandConfirmWarpPlace;
public int variableCommandConfirmRaise;
public int variableCommandConfirmRaiseSender;
public int variableCommandConfirmRaiseSenderByID;
public int variableCommandConfirmRaiseSenderSex;
public int variableCommandConfirmRaisePlace;
}
}