@@ -1253,9 +1253,23 @@ public static void SendCreateCharacter(Client client)
12531253 //CharactersPacket
12541254 public static void SendPlayerCharacters ( Client client )
12551255 {
1256- var characters = new List < CharacterPacket > ( ) ;
1257- if ( client . User == null )
1256+ if ( client == default )
12581257 {
1258+ Log . Warn ( $ "Tried to { nameof ( SendPlayerCharacters ) } () to a null client?") ;
1259+ return ;
1260+ }
1261+
1262+ var user = client . User ;
1263+ if ( user == default )
1264+ {
1265+ Log . Warn ( $ "Tried to { nameof ( SendPlayerCharacters ) } () to client with no user? ({ client . Id } )") ;
1266+ return ;
1267+ }
1268+
1269+ var clientCharacters = client . Characters ;
1270+ if ( clientCharacters == default )
1271+ {
1272+ Log . Warn ( $ "Tried to { nameof ( SendPlayerCharacters ) } () to client with no characters? (client { client . Id } /user { user . Id } )") ;
12591273 return ;
12601274 }
12611275
@@ -1267,73 +1281,92 @@ public static void SendPlayerCharacters(Client client)
12671281 }
12681282 }
12691283
1270- var clientCharacters = client ? . Characters ;
1271- if ( clientCharacters == default )
1284+ var characterPackets = new List < CharacterPacket > ( ) ;
1285+
1286+ var equipmentSlotsOptions = Options . EquipmentSlots ;
1287+ var paperdollOrderOptions = Options . PaperdollOrder ;
1288+
1289+ if ( clientCharacters . Count < 1 )
12721290 {
1273- Log . Error ( $ "PLEASE REPORT THIS WITH LOGS: About to crash because { ( client == default ? nameof ( client ) : nameof ( client . Characters ) ) } is null.") ;
1291+ CharactersPacket emptyBulkCharactersPacket = new (
1292+ Array . Empty < CharacterPacket > ( ) ,
1293+ client . Characters . Count < Options . MaxCharacters
1294+ ) ;
1295+
1296+ if ( ! client . Send ( emptyBulkCharactersPacket ) )
1297+ {
1298+ Log . Error ( $ "Failed to send empty bulk characters packet to { client . Id } ") ;
1299+ }
1300+
1301+ return ;
12741302 }
12751303
1276- if ( client . Characters . Count > 0 ) /* TODO: Fix NRE when logging out and back in */
1304+ foreach ( var character in clientCharacters . OrderByDescending ( p => p . LastOnline ) )
12771305 {
1278- foreach ( var character in client . Characters . OrderByDescending ( p => p . LastOnline ) )
1279- {
1280- var equipmentArray = character . Equipment ;
1281- var equipment = new EquipmentFragment [ Options . EquipmentSlots . Count + 1 ] ;
1306+ var equipmentArray = character . Equipment ;
1307+ var equipment = new EquipmentFragment [ equipmentSlotsOptions . Count + 1 ] ;
12821308
1283- //Draw the equipment/paperdolls
1284- for ( var z = 0 ; z < Options . PaperdollOrder [ 1 ] . Count ; z ++ )
1309+ // Draw the equipment/paperdolls
1310+ var paperdollOrderOptionLayer1 = paperdollOrderOptions [ 1 ] ;
1311+ for ( var z = 0 ; z < paperdollOrderOptionLayer1 . Count ; z ++ )
1312+ {
1313+ var indexOfPaperdoll = equipmentSlotsOptions . IndexOf ( Options . PaperdollOrder [ 1 ] [ z ] ) ;
1314+ if ( indexOfPaperdoll < 0 )
12851315 {
1286- if ( Options . EquipmentSlots . IndexOf ( Options . PaperdollOrder [ 1 ] [ z ] ) > - 1 )
1287- {
1288- if ( equipmentArray [ Options . EquipmentSlots . IndexOf ( Options . PaperdollOrder [ 1 ] [ z ] ) ] > - 1 &&
1289- equipmentArray [ Options . EquipmentSlots . IndexOf ( Options . PaperdollOrder [ 1 ] [ z ] ) ] <
1290- Options . MaxInvItems )
1291- {
1292- var paperdollOrder = Options . PaperdollOrder [ 1 ] [ z ] ;
1293- var equipmentSlot = Options . EquipmentSlots . IndexOf ( paperdollOrder ) ;
1294- var itemIndex = equipmentArray [ equipmentSlot ] ;
1295-
1296- var itemId = character
1297- . Items [ itemIndex ]
1298- . ItemId ;
1299-
1300- if ( ItemBase . Get ( itemId ) != null )
1301- {
1302- var itemdata = ItemBase . Get ( itemId ) ;
1303- equipment [ z ] = new EquipmentFragment
1304- {
1305- Name = character . Gender == 0 ? itemdata . MalePaperdoll : itemdata . FemalePaperdoll ,
1306- RenderColor = itemdata . Color ,
1307- } ;
1308- }
1309- }
1310- }
1311- else
1316+ const string equipmentFragmentNamePlayer = "Player" ;
1317+ if ( Options . PaperdollOrder [ 1 ] [ z ] == equipmentFragmentNamePlayer )
13121318 {
1313- if ( Options . PaperdollOrder [ 1 ] [ z ] == "Player" )
1314- {
1315- equipment [ z ] = new EquipmentFragment { Name = "Player" } ;
1316- }
1319+ equipment [ z ] = new EquipmentFragment { Name = equipmentFragmentNamePlayer } ;
13171320 }
1321+
1322+ continue ;
13181323 }
13191324
1320- characters . Add (
1321- new CharacterPacket (
1322- character . Id , character . Name , character . Sprite , character . Face , character . Level ,
1323- ClassBase . GetName ( character . ClassId ) , equipment
1324- )
1325- ) ;
1325+ var inventoryIndexOfEquip = equipmentArray [ indexOfPaperdoll ] ;
1326+ if ( inventoryIndexOfEquip <= - 1 || inventoryIndexOfEquip >= Options . MaxInvItems )
1327+ {
1328+ continue ;
1329+ }
1330+
1331+ var paperdollOrder = paperdollOrderOptionLayer1 [ z ] ;
1332+ var equipmentSlot = equipmentSlotsOptions . IndexOf ( paperdollOrder ) ;
1333+ var itemIndex = equipmentArray [ equipmentSlot ] ;
1334+
1335+ var itemId = character . Items [ itemIndex ] . ItemId ;
1336+
1337+ if ( ! ItemBase . TryGet ( itemId , out var itemDescriptor ) )
1338+ {
1339+ continue ;
1340+ }
1341+
1342+ equipment [ z ] = new EquipmentFragment
1343+ {
1344+ Name = itemDescriptor . GetPaperdollForGender ( character . Gender ) ,
1345+ RenderColor = itemDescriptor . Color ,
1346+ } ;
13261347 }
1348+
1349+ characterPackets . Add (
1350+ new CharacterPacket (
1351+ character . Id ,
1352+ character . Name ,
1353+ character . Sprite ,
1354+ character . Face ,
1355+ character . Level ,
1356+ ClassBase . GetName ( character . ClassId ) ,
1357+ equipment
1358+ )
1359+ ) ;
13271360 }
13281361
1329- CharactersPacket packet = new (
1330- characters . ToArray ( ) ,
1362+ CharactersPacket bulkCharactersPacket = new (
1363+ characterPackets . ToArray ( ) ,
13311364 client . Characters . Count < Options . MaxCharacters
13321365 ) ;
13331366
1334- if ( ! client . Send ( packet ) )
1367+ if ( ! client . Send ( bulkCharactersPacket ) )
13351368 {
1336- Log . Error ( $ "Failed to send { packet . Characters . Length } characters to { client . Id } ") ;
1369+ Log . Error ( $ "Failed to send { bulkCharactersPacket . Characters . Length } characters to { client . Id } ") ;
13371370 }
13381371 }
13391372
0 commit comments