/* * Used to sync custom ai float arrays. (the npc or projectile requires a method called 'public void SetAI(float[] ai, int type)' that sets the ai for this to work) */ public static void SyncAI(int entType, int id, float[] ai, int aitype) { object[] ai2 = new object[ai.Length + 4]; ai2[0] = (byte)entType; ai2[1] = (short)id; ai2[2] = (byte)aitype; ai2[3] = (byte)ai.Length; for (int m = 4; m < ai2.Length; m++) { ai2[m] = ai[m - 4]; } MNet.SendBaseNetMessage(1, ai2); }
public override void HandlePacket(BinaryReader reader, int whoAmI) { switch (reader.ReadByte()) { case 0: //server side spawning creepers if (Main.netMode == 2) { byte p = reader.ReadByte(); int multiplier = reader.ReadByte(); int n = NPC.NewNPC((int)Main.player[p].Center.X, (int)Main.player[p].Center.Y, NPCType("CreeperGutted"), 0, p, 0f, multiplier, 0f); if (n != 200) { Main.npc[n].velocity = Vector2.UnitX.RotatedByRandom(2 * Math.PI) * 8; NetMessage.SendData(23, -1, -1, null, n); } } break; case 1: //server side synchronize pillar data request if (Main.netMode == 2) { byte pillar = reader.ReadByte(); if (!Main.npc[pillar].GetGlobalNPC <FargoSoulsGlobalNPC>().masoBool[1]) { Main.npc[pillar].GetGlobalNPC <FargoSoulsGlobalNPC>().masoBool[1] = true; Main.npc[pillar].GetGlobalNPC <FargoSoulsGlobalNPC>().SetDefaults(Main.npc[pillar]); Main.npc[pillar].life = Main.npc[pillar].lifeMax; } } break; case 2: //net updating maso FargoSoulsGlobalNPC fargoNPC = Main.npc[reader.ReadByte()].GetGlobalNPC <FargoSoulsGlobalNPC>(); fargoNPC.masoBool[0] = reader.ReadBoolean(); fargoNPC.masoBool[1] = reader.ReadBoolean(); fargoNPC.masoBool[2] = reader.ReadBoolean(); fargoNPC.masoBool[3] = reader.ReadBoolean(); break; case 3: //rainbow slime/paladin, MP clients syncing to server if (Main.netMode == 1) { byte npc = reader.ReadByte(); Main.npc[npc].lifeMax = reader.ReadInt32(); float newScale = reader.ReadSingle(); Main.npc[npc].position = Main.npc[npc].Center; Main.npc[npc].width = (int)(Main.npc[npc].width / Main.npc[npc].scale * newScale); Main.npc[npc].height = (int)(Main.npc[npc].height / Main.npc[npc].scale * newScale); Main.npc[npc].scale = newScale; Main.npc[npc].Center = Main.npc[npc].position; } break; case 4: //moon lord vulnerability synchronization if (Main.netMode == 1) { int ML = reader.ReadByte(); Main.npc[ML].GetGlobalNPC <FargoSoulsGlobalNPC>().Counter = reader.ReadInt32(); FargoSoulsGlobalNPC.masoStateML = reader.ReadByte(); } break; case 5: //retinazer laser MP sync if (Main.netMode == 1) { int reti = reader.ReadByte(); Main.npc[reti].GetGlobalNPC <FargoSoulsGlobalNPC>().masoBool[2] = reader.ReadBoolean(); Main.npc[reti].GetGlobalNPC <FargoSoulsGlobalNPC>().Counter = reader.ReadInt32(); } break; case 6: //shark MP sync if (Main.netMode == 1) { int shark = reader.ReadByte(); Main.npc[shark].GetGlobalNPC <FargoSoulsGlobalNPC>().SharkCount = reader.ReadByte(); } break; case 7: //client to server activate dark caster family if (Main.netMode == 2) { int caster = reader.ReadByte(); if (Main.npc[caster].GetGlobalNPC <FargoSoulsGlobalNPC>().Counter2 == 0) { Main.npc[caster].GetGlobalNPC <FargoSoulsGlobalNPC>().Counter2 = reader.ReadInt32(); } } break; case 8: //server to clients reset counter if (Main.netMode == 1) { int caster = reader.ReadByte(); Main.npc[caster].GetGlobalNPC <FargoSoulsGlobalNPC>().Counter2 = 0; } break; case 9: //client to server, request heart spawn if (Main.netMode == 2) { int n = reader.ReadByte(); Item.NewItem(Main.npc[n].Hitbox, ItemID.Heart); } break; case 10: //client to server, sync cultist data if (Main.netMode == 2) { int cult = reader.ReadByte(); FargoSoulsGlobalNPC cultNPC = Main.npc[cult].GetGlobalNPC <FargoSoulsGlobalNPC>(); cultNPC.Counter += reader.ReadInt32(); cultNPC.Counter2 += reader.ReadInt32(); cultNPC.Timer += reader.ReadInt32(); Main.npc[cult].localAI[3] += reader.ReadSingle(); } break; case 11: //refresh creeper if (Main.netMode != 0) { byte player = reader.ReadByte(); NPC creeper = Main.npc[reader.ReadByte()]; if (creeper.active && creeper.type == NPCType("CreeperGutted") && creeper.ai[0] == player) { int damage = creeper.lifeMax - creeper.life; creeper.life = creeper.lifeMax; if (damage > 0) { CombatText.NewText(creeper.Hitbox, CombatText.HealLife, damage); } if (Main.netMode == 2) { creeper.netUpdate = true; } } } break; case 77: //server side spawning fishron EX if (Main.netMode == 2) { byte target = reader.ReadByte(); int x = reader.ReadInt32(); int y = reader.ReadInt32(); FargoSoulsGlobalNPC.spawnFishronEX = true; NPC.NewNPC(x, y, NPCID.DukeFishron, 0, 0f, 0f, 0f, 0f, target); FargoSoulsGlobalNPC.spawnFishronEX = false; NetMessage.BroadcastChatMessage(NetworkText.FromLiteral("Duke Fishron EX has awoken!"), new Color(50, 100, 255)); } break; case 78: //confirming fish EX max life int f = reader.ReadInt32(); Main.npc[f].lifeMax = reader.ReadInt32(); break; default: break; } //BaseMod Stuff MsgType msg = (MsgType)reader.ReadByte(); if (msg == MsgType.ProjectileHostility) //projectile hostility and ownership { int owner = reader.ReadInt32(); int projID = reader.ReadInt32(); bool friendly = reader.ReadBoolean(); bool hostile = reader.ReadBoolean(); if (Main.projectile[projID] != null) { Main.projectile[projID].owner = owner; Main.projectile[projID].friendly = friendly; Main.projectile[projID].hostile = hostile; } if (Main.netMode == 2) { MNet.SendBaseNetMessage(0, owner, projID, friendly, hostile); } } else if (msg == MsgType.SyncAI) //sync AI array { int classID = reader.ReadByte(); int id = reader.ReadInt16(); int aitype = reader.ReadByte(); int arrayLength = reader.ReadByte(); float[] newAI = new float[arrayLength]; for (int m = 0; m < arrayLength; m++) { newAI[m] = reader.ReadSingle(); } if (classID == 0 && Main.npc[id] != null && Main.npc[id].active && Main.npc[id].modNPC != null && Main.npc[id].modNPC is ParentNPC) { ((ParentNPC)Main.npc[id].modNPC).SetAI(newAI, aitype); } else if (classID == 1 && Main.projectile[id] != null && Main.projectile[id].active && Main.projectile[id].modProjectile != null && Main.projectile[id].modProjectile is ParentProjectile) { ((ParentProjectile)Main.projectile[id].modProjectile).SetAI(newAI, aitype); } if (Main.netMode == 2) { BaseNet.SyncAI(classID, id, newAI, aitype); } } }