Fixed up warping with new values for SetActorPosition packet. The script instantiation packet is done and implemented. Player init is done except for parameters.

This commit is contained in:
Filip Maj 2016-01-09 18:52:23 -05:00
parent 071b1f11a8
commit c9f35a207b
6 changed files with 82 additions and 55 deletions

View File

@ -218,7 +218,6 @@ namespace FFXIVClassic_Lobby_Server
client.queuePacket(SetWeatherPacket.buildPacket(player.actorID, SetWeatherPacket.WEATHER_CLEAR), true, false); client.queuePacket(SetWeatherPacket.buildPacket(player.actorID, SetWeatherPacket.WEATHER_CLEAR), true, false);
BasePacket actorPacket = player.getActor().getInitPackets(player.actorID); BasePacket actorPacket = player.getActor().getInitPackets(player.actorID);
actorPacket.debugPrintPacket();
client.queuePacket(actorPacket); client.queuePacket(actorPacket);
//Retainers //Retainers
@ -603,7 +602,6 @@ namespace FFXIVClassic_Lobby_Server
actorPacket.replaceActorID(entry.Value.actorID); actorPacket.replaceActorID(entry.Value.actorID);
entry.Value.getConnection2().queuePacket(packet); entry.Value.getConnection2().queuePacket(packet);
actorPacket.debugPrintPacket();
entry.Value.getConnection2().queuePacket(actorPacket); entry.Value.getConnection2().queuePacket(actorPacket);

View File

@ -265,7 +265,10 @@ namespace FFXIVClassic_Lobby_Server
public void doWarp(String map, String x, String y, String z) public void doWarp(String map, String x, String y, String z)
{ {
mProcessor.doWarp(Convert.ToUInt32(map), Single.Parse(x), Single.Parse(y), Single.Parse(z)); if (map.ToLower().StartsWith("0x"))
mProcessor.doWarp(Convert.ToUInt32(map, 16), Single.Parse(x), Single.Parse(y), Single.Parse(z));
else
mProcessor.doWarp(Convert.ToUInt32(map), Single.Parse(x), Single.Parse(y), Single.Parse(z));
} }
} }

View File

@ -61,10 +61,17 @@ namespace FFXIVClassic_Map_Server.dataobjects
public SubPacket createSpawnPositonPacket(uint playerActorId, uint spawnType) 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); SubPacket spawnPacket;
if (!spawnedFirstTime && playerActorId == actorId)
spawnPacket = SetActorPositionPacket.buildPacket(actorId, playerActorId, 0, positionX, positionY, positionZ, rotation, spawnType, false);
else if (playerActorId == actorId)
spawnPacket = SetActorPositionPacket.buildPacket(actorId, playerActorId, 0xFFFFFFFF, positionX, positionY, positionZ, rotation, spawnType, true);
else
spawnPacket = SetActorPositionPacket.buildPacket(actorId, playerActorId, actorId, positionX, positionY, positionZ, rotation, spawnType, false);
//return SetActorPositionPacket.buildPacket(actorId, playerActorId, -211.895477f, 190.000000f, 29.651011f, 2.674819f, SetActorPositionPacket.SPAWNTYPE_PLAYERWAKE); //return SetActorPositionPacket.buildPacket(actorId, playerActorId, -211.895477f, 190.000000f, 29.651011f, 2.674819f, SetActorPositionPacket.SPAWNTYPE_PLAYERWAKE);
//spawnedFirstTime = true; spawnedFirstTime = true;
//return spawnPacket; return spawnPacket;
} }
public SubPacket createPositionUpdatePacket(uint playerActorId) public SubPacket createPositionUpdatePacket(uint playerActorId)
@ -92,7 +99,7 @@ namespace FFXIVClassic_Map_Server.dataobjects
List<SubPacket> subpackets = new List<SubPacket>(); List<SubPacket> subpackets = new List<SubPacket>();
subpackets.Add(createAddActorPacket(playerActorId)); subpackets.Add(createAddActorPacket(playerActorId));
subpackets.Add(createSpeedPacket(playerActorId)); subpackets.Add(createSpeedPacket(playerActorId));
subpackets.Add(createSpawnPositonPacket(playerActorId, 0xFF)); subpackets.Add(createSpawnPositonPacket(playerActorId, 0x1));
subpackets.Add(createNamePacket(playerActorId)); subpackets.Add(createNamePacket(playerActorId));
subpackets.Add(createStatePacket(playerActorId)); subpackets.Add(createStatePacket(playerActorId));
subpackets.Add(createIsZoneingPacket(playerActorId)); subpackets.Add(createIsZoneingPacket(playerActorId));

View File

@ -43,8 +43,8 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara
public Player(uint actorID) : base(actorID) public Player(uint actorID) : base(actorID)
{ {
actorName = String.Format("_player{0:00000000}", actorID); actorName = String.Format("_pc{0:00000000}", actorID);
className = "Player";
currentSubState = SetActorStatePacket.SUB_STATE_PLAYER; currentSubState = SetActorStatePacket.SUB_STATE_PLAYER;
DBStats stats = Database.getCharacterStats(actorID); DBStats stats = Database.getCharacterStats(actorID);
@ -118,8 +118,7 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara
List<LuaParam> lParams; List<LuaParam> lParams;
if (isMyPlayer(playerActorId)) if (isMyPlayer(playerActorId))
{ {
lParams = LuaUtils.createLuaParamList("/Chara/Player/Player_work", false, false, false, true, 0, false, timers, true);
lParams = LuaUtils.createLuaParamList("/Chara/Player/Player_work", false, false, false, false, false, true);
} }
else else
lParams = LuaUtils.createLuaParamList("/Chara/Player/Player_work", false, false, false, false, false, true); lParams = LuaUtils.createLuaParamList("/Chara/Player/Player_work", false, false, false, false, false, true);
@ -134,7 +133,7 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara
if (isMyPlayer(playerActorId)) if (isMyPlayer(playerActorId))
subpackets.AddRange(create0x132Packets(playerActorId)); subpackets.AddRange(create0x132Packets(playerActorId));
subpackets.Add(createSpeedPacket(playerActorId)); subpackets.Add(createSpeedPacket(playerActorId));
subpackets.Add(createSpawnPositonPacket(playerActorId, 0xFF)); subpackets.Add(createSpawnPositonPacket(playerActorId, 0x1));
subpackets.Add(createAppearancePacket(playerActorId)); subpackets.Add(createAppearancePacket(playerActorId));
subpackets.Add(createNamePacket(playerActorId)); subpackets.Add(createNamePacket(playerActorId));
subpackets.Add(_0xFPacket.buildPacket(playerActorId, playerActorId)); subpackets.Add(_0xFPacket.buildPacket(playerActorId, playerActorId));
@ -143,7 +142,8 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara
subpackets.Add(createInitStatusPacket(playerActorId)); subpackets.Add(createInitStatusPacket(playerActorId));
subpackets.Add(createSetActorIconPacket(playerActorId)); subpackets.Add(createSetActorIconPacket(playerActorId));
subpackets.Add(createIsZoneingPacket(playerActorId)); subpackets.Add(createIsZoneingPacket(playerActorId));
//subpackets.Add(createScriptBindPacket(playerActorId)); subpackets.Add(createScriptBindPacket(playerActorId));
return BasePacket.createPacket(subpackets, true, false); return BasePacket.createPacket(subpackets, true, false);
} }

View File

@ -42,12 +42,12 @@ namespace FFXIVClassic_Map_Server
} }
value = Encoding.ASCII.GetString(list.ToArray()); value = Encoding.ASCII.GetString(list.ToArray());
break; break;
case 0x3: //Boolean False case 0x3: //Boolean True
value = false;
break;
case 0x4: //Boolean True
value = true; value = true;
break; break;
case 0x4: //Boolean False
value = false;
break;
case 0x5: //Nil case 0x5: //Nil
wasNil = true; wasNil = true;
break; break;
@ -85,10 +85,13 @@ namespace FFXIVClassic_Map_Server
switch (l.typeID) switch (l.typeID)
{ {
case 0x0: //Int32 case 0x0: //Int32
writer.Write((UInt32)l.value); if (l.value is uint)
writer.Write((UInt32)Utils.swapEndian((UInt32)l.value));
else
writer.Write((UInt32)Utils.swapEndian((UInt32)(Int32)l.value));
break; break;
case 0x1: //Int32 case 0x1: //Int32
writer.Write((UInt32)l.value); writer.Write((UInt32)Utils.swapEndian((UInt32)l.value));
break; break;
case 0x2: //Null Termed String case 0x2: //Null Termed String
string sv = (string)l.value; string sv = (string)l.value;
@ -102,7 +105,7 @@ namespace FFXIVClassic_Map_Server
case 0x5: //Nil case 0x5: //Nil
break; break;
case 0x6: //Actor (By Id) case 0x6: //Actor (By Id)
writer.Write((UInt32)l.value); writer.Write((UInt32)Utils.swapEndian((UInt32)l.value));
break; break;
case 0x10: //Byte? case 0x10: //Byte?
break; break;
@ -150,12 +153,12 @@ namespace FFXIVClassic_Map_Server
} }
value = Encoding.ASCII.GetString(list.ToArray()); value = Encoding.ASCII.GetString(list.ToArray());
break; break;
case 0x3: //Boolean False case 0x3: //Boolean True
value = false;
break;
case 0x4: //Boolean True
value = true; value = true;
break; break;
case 0x4: //Boolean False
value = false;
break;
case 0x5: //Nil case 0x5: //Nil
wasNil = true; wasNil = true;
break; break;
@ -192,33 +195,49 @@ namespace FFXIVClassic_Map_Server
foreach (object o in list) foreach (object o in list)
{ {
if (o is uint) if (o.GetType().IsArray)
{ {
luaParams.Add(new LuaParam(0x0, (uint)o)); Array arrayO = (Array)o;
} foreach (object o2 in arrayO)
else if (o is string) addToList(o2, luaParams);
{
luaParams.Add(new LuaParam(0x2, (string)o));
}
else if (o is bool)
{
if (((bool)o))
luaParams.Add(new LuaParam(0x4, null));
else
luaParams.Add(new LuaParam(0x3, null));
}
else if (o == null)
{
luaParams.Add(new LuaParam(0x5, null));
}
else if (o is Actor)
{
luaParams.Add(new LuaParam(0x6, ((Actor)o).actorId));
} }
else
addToList(o, luaParams);
} }
return luaParams; return luaParams;
} }
private static void addToList(object o, List<LuaParam> luaParams)
{
if (o is uint)
{
luaParams.Add(new LuaParam(0x0, (uint)o));
}
else if (o is int)
{
luaParams.Add(new LuaParam(0x0, (int)o));
}
else if (o is string)
{
luaParams.Add(new LuaParam(0x2, (string)o));
}
else if (o is bool)
{
if (((bool)o))
luaParams.Add(new LuaParam(0x3, null));
else
luaParams.Add(new LuaParam(0x4, null));
}
else if (o == null)
{
luaParams.Add(new LuaParam(0x5, null));
}
else if (o is Actor)
{
luaParams.Add(new LuaParam(0x6, ((Actor)o).actorId));
}
}
public static object[] createLuaParamObjectList(List <LuaParam> luaParams) public static object[] createLuaParamObjectList(List <LuaParam> luaParams)
{ {
@ -247,12 +266,12 @@ namespace FFXIVClassic_Map_Server
case 0x2: //Null Termed String case 0x2: //Null Termed String
dumpString += String.Format("\"{0}\"", (string)lParams[i].value); dumpString += String.Format("\"{0}\"", (string)lParams[i].value);
break; break;
case 0x3: //Boolean False case 0x3: //Boolean True
dumpString += "false";
break;
case 0x4: //Boolean True
dumpString += "true"; dumpString += "true";
break; break;
case 0x4: //Boolean False
dumpString += "false";
break;
case 0x5: //NULL??? case 0x5: //NULL???
dumpString += "nil"; dumpString += "nil";
break; break;

View File

@ -27,7 +27,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor
public const float INNPOS_Z = 165.050003f; public const float INNPOS_Z = 165.050003f;
public const float INNPOS_ROT = -1.530000f; public const float INNPOS_ROT = -1.530000f;
public static SubPacket buildPacket(uint sourceActorID, uint targetActorID,float x, float y, float z, float rotation, uint spawnType) public static SubPacket buildPacket(uint sourceActorID, uint targetActorID, uint actorId, float x, float y, float z, float rotation, uint spawnType, bool isZoningPlayer)
{ {
byte[] data = new byte[PACKET_SIZE-0x20]; byte[] data = new byte[PACKET_SIZE-0x20];
@ -35,8 +35,8 @@ namespace FFXIVClassic_Map_Server.packets.send.actor
{ {
using (BinaryWriter binWriter = new BinaryWriter(mem)) using (BinaryWriter binWriter = new BinaryWriter(mem))
{ {
binWriter.Write((Int32)0); binWriter.Write((Int32)0);
binWriter.Write((Int32)0); binWriter.Write((Int32)actorId);
binWriter.Write((Single)x); binWriter.Write((Single)x);
binWriter.Write((Single)y); binWriter.Write((Single)y);
binWriter.Write((Single)z); binWriter.Write((Single)z);
@ -45,7 +45,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor
binWriter.BaseStream.Seek(0x24, SeekOrigin.Begin); binWriter.BaseStream.Seek(0x24, SeekOrigin.Begin);
binWriter.Write((UInt16)spawnType); binWriter.Write((UInt16)spawnType);
binWriter.Write((UInt16)(0)); binWriter.Write((UInt16)(isZoningPlayer ? 1 : 0));
} }
} }