List <Block> ListN() { List <bool> bools = new List <bool>() { }; for (int variant_i = 0; variant_i < variant.Count; variant_i++) { if (CheckCount(Inv, variant[variant_i]) && ListCheck.ListContainsNew(variant[variant_i], Inv.item_list)) { bools.Add(true); } else { bools.Add(false); } } for (int bool_i = 0; bool_i < bools.Count; bool_i++) { if (bools[bool_i]) { return(variant[bool_i]); } } return(null); }
public void ClearPhysics() { for (int i = 0; i < ListCheck.Count; i++) { RevertPhysics(ListCheck.Items[i]); } ListCheck.Clear(); listCheckExists.Clear(); ListUpdate.Clear(); listUpdateExists.Clear(); }
public void Dispose() { Extras.Clear(); ListCheck.Clear(); listCheckExists.Clear(); ListUpdate.Clear(); listUpdateExists.Clear(); UndoBuffer.Clear(); BlockDB.Cache.Clear(); Zones.Clear(); blockqueue.ClearAll(); lock (saveLock) { blocks = null; CustomBlocks = null; } }
private void AddCheck(int b) { try { if (!ListCheck.Exists(Check => Check.b == b)) //Checks to see if block is already due for a check { ListCheck.Add(new Check(b)); //Adds block to list to be updated } } catch { //s.Log("Warning-PhysicsCheck"); //ListCheck.Add(new Check(b)); //Lousy back up plan } }
bool CheckCount(Inventory Inv, List <Block> need_to_craft) { if (Inv.item_list.Count == 0) { return(false); } sorting_inv = new List <Block>() { }; sorting_inv = Inv.item_list.ToList(); sorting_inv.RemoveAll(el => !need_to_craft.Exists(el2 => el2.name == el.name)); if (sorting_inv.Count == 0) { return(false); } if (sorting_inv.Count >= need_to_craft.Count) { return(ListCheck.ListContainsNew(need_to_craft, sorting_inv)); } return(false); }
public void AddCheck(int index, bool overRide, PhysicsArgs data) { try { int x = index % Width; int y = (index / Width) / Length; int z = (index / Width) % Length; if (x >= Width || y >= Height || z >= Length) { return; } if (listCheckExists.TrySetOn(x, y, z)) { Check check; check.Index = index; check.data = data; ListCheck.Add(check); // Adds block to list to be updated } else if (overRide) { Check[] items = ListCheck.Items; int count = ListCheck.Count; for (int i = 0; i < count; i++) { if (items[i].Index != index) { continue; } items[i].data = data; return; } //Dont need to check physics here because if the list is active, then physics is active :) } if (!physThreadStarted && physics > 0) { StartPhysics(); } } catch { //s.Log("Warning-PhysicsCheck"); //ListCheck.Add(new Check(b)); //Lousy back up plan } }
public void AddCheck(int b, bool overRide, PhysicsArgs data) { try { int x = b % Width; int y = (b / Width) / Length; int z = (b / Width) % Length; if (x >= Width || y >= Height || z >= Length) { return; } if (!listCheckExists.Get(x, y, z)) { ListCheck.Add(new Check(b, data)); //Adds block to list to be updated listCheckExists.Set(x, y, z, true); } else if (overRide) { Check[] items = ListCheck.Items; int count = ListCheck.Count; for (int i = 0; i < count; i++) { if (items[i].b != b) { continue; } items[i].data = data; return; } //Dont need to check physics here because if the list is active, then physics is active :) } if (!physicssate && physics > 0) { StartPhysics(); } } catch { //s.Log("Warning-PhysicsCheck"); //ListCheck.Add(new Check(b)); //Lousy back up plan } }
void PhysicsTick() { lastCheck = ListCheck.Count; const uint mask = PhysicsArgs.TypeMask; HandlePhysics[] handlers = PhysicsHandlers; ExtraInfoHandler extraHandler = ExtraInfoPhysics.normalHandler; if (physics == 5) { handlers = physicsDoorsHandlers; extraHandler = ExtraInfoPhysics.doorsHandler; } PhysInfo C; for (int i = 0; i < ListCheck.Count; i++) { Check chk = ListCheck.Items[i]; IntToPos(chk.Index, out C.X, out C.Y, out C.Z); C.Index = chk.Index; C.Data = chk.data; try { if (OnPhysicsUpdateEvent.handlers.Count > 0) { OnPhysicsUpdateEvent.Call(C.X, C.Y, C.Z, C.Data, this); } C.Block = blocks[chk.Index]; #if TEN_BIT_BLOCKS BlockID extended = Block.ExtendedBase[C.Block]; if (extended > 0) { C.Block = (BlockID)(extended | FastGetExtTile(C.X, C.Y, C.Z)); } #else if (C.Block == Block.custom_block) { C.Block = (BlockID)(Block.Extended | FastGetExtTile(C.X, C.Y, C.Z)); } #endif if ((C.Data.Raw & mask) == 0 || C.Data.Type1 == PhysicsArgs.Custom || extraHandler(this, ref C)) { HandlePhysics handler = handlers[C.Block]; if (handler != null) { handler(this, ref C); } else if ((C.Data.Raw & mask) == 0 || !C.Data.HasWait) { C.Data.Data = PhysicsArgs.RemoveFromChecks; } } ListCheck.Items[i].data = C.Data; } catch { listCheckExists.Set(C.X, C.Y, C.Z, false); ListCheck.RemoveAt(i); } } RemoveExpiredChecks(); lastUpdate = ListUpdate.Count; if (ListUpdate.Count > 0 && bulkSender == null) { bulkSender = new BufferedBlockSender(this); } for (int i = 0; i < ListUpdate.Count; i++) { Update U = ListUpdate.Items[i]; try { BlockID block = U.data.Data; U.data.Data = 0; // Is the Ext flag just an indicator for the block update? byte extBits = U.data.ExtBlock; if (extBits != 0 && (U.data.Raw & PhysicsArgs.TypeMask) == 0) { block |= (BlockID)(extBits << Block.ExtendedShift); U.data.Raw &= ~PhysicsArgs.ExtBits; } if (DoPhysicsBlockchange(U.Index, block, false, U.data, true)) { bulkSender.Add(U.Index, block); } } catch { Logger.Log(LogType.Warning, "Phys update issue"); } } if (bulkSender != null) { bulkSender.Flush(); } ListUpdate.Clear(); listUpdateExists.Clear(); }
public void ClearPhysics() { ushort x, y, z; ListCheck.ForEach(delegate(Check C) //checks though each block { IntToPos(C.b, out x, out y, out z); //attempts on shutdown to change blocks back into normal selves that are active, hopefully without needing to send into to clients. switch (blocks[C.b]) { case 200: case 202: case 203: blocks[C.b] = 0; break; case 201: //blocks[C.b] = 111; Blockchange(x, y, z, 111); break; case 205: //blocks[C.b] = 113; Blockchange(x, y, z, 113); break; case 206: //blocks[C.b] = 114; Blockchange(x, y, z, 114); break; case 208: //doorair_white Blockchange(x, y, z, 207); break; case 209: Blockchange(x, y, z, 50); break; case 210: Blockchange(x, y, z, 51); break; case 211: Blockchange(x, y, z, 52); break; case 213: Blockchange(x, y, z, 54); break; case 214: Blockchange(x, y, z, 55); break; case 215: Blockchange(x, y, z, 56); break; case 216: Blockchange(x, y, z, 57); break; case 217: Blockchange(x, y, z, 58); break; case 218: Blockchange(x, y, z, 59); break; case 219: Blockchange(x, y, z, 60); break; case 220: Blockchange(x, y, z, 61); break; case 221: Blockchange(x, y, z, 62); break; case 222: Blockchange(x, y, z, 63); break; case 223: Blockchange(x, y, z, 64); break; case 224: Blockchange(x, y, z, 65); break; case 225: Blockchange(x, y, z, 66); break; case 226: Blockchange(x, y, z, 67); break; case 227: Blockchange(x, y, z, 68); break; case 228: Blockchange(x, y, z, 69); break; case 229: Blockchange(x, y, z, 70); break; case 230: Blockchange(x, y, z, 71); break; case 231: Blockchange(x, y, z, 72); break; case 232: Blockchange(x, y, z, 73); break; case 233: Blockchange(x, y, z, 74); break; case 234: Blockchange(x, y, z, 75); break; case 235: Blockchange(x, y, z, 76); break; case 236: Blockchange(x, y, z, 77); break; case 237: Blockchange(x, y, z, 78); break; case 238: Blockchange(x, y, z, 79); break; case 239: Blockchange(x, y, z, 80); break; case 240: Blockchange(x, y, z, 81); break; case 241: Blockchange(x, y, z, 82); break; case 242: Blockchange(x, y, z, 83); break; case 243: Blockchange(x, y, z, 84); break; case 244: Blockchange(x, y, z, 85); break; case 245: Blockchange(x, y, z, 87); break; case 246: Blockchange(x, y, z, 86); break; case 247: Blockchange(x, y, z, 88); break; case 248: Blockchange(x, y, z, 89); break; case 249: Blockchange(x, y, z, 90); break; } }); ListCheck.Clear(); ListUpdate.Clear(); }
public void CalcPhysics() { try { if (Physics > 0) { bool extraPhysicsCheck = false; ushort x, y, z; ListCheck.ForEach(delegate(Check C) //checks though each block to be updated { try { IntToPos(C.b, out x, out y, out z); //Player.GlobalMessage("Found Block! = " + Block.Name(blocks[C.b]) + " : Ctime = " + C.time.ToString()); switch (blocks[C.b]) { case Block.air: //Placed air //initialy checks if block is valid PhysAir(PosToInt((ushort)(x + 1), y, z)); PhysAir(PosToInt((ushort)(x - 1), y, z)); PhysAir(PosToInt(x, y, (ushort)(z + 1))); PhysAir(PosToInt(x, y, (ushort)(z - 1))); PhysAir(PosToInt(x, (ushort)(y + 1), z)); //Check block above the air //Edge of map water if (y < depth / 2 && y >= (depth / 2) - 2) { if (x == 0 || x == width - 1 || z == 0 || z == height - 1) { AddUpdate(C.b, Block.water); } } C.time = 255; break; case Block.dirt: //Dirt if (C.time > 80) //To grass { if (Block.LightPass(GetTile(x, (ushort)(y + 1), z))) { AddUpdate(C.b, Block.grass); } C.time = 255; } else { C.time++; } break; case Block.water: //Active_water //initialy checks if block is valid if (!PhysSpongeCheck(C.b)) { if (GetTile(x, (ushort)(y + 1), z) != Block.Zero) { PhysSandCheck(PosToInt(x, (ushort)(y + 1), z)); } PhysWater(PosToInt((ushort)(x + 1), y, z)); PhysWater(PosToInt((ushort)(x - 1), y, z)); PhysWater(PosToInt(x, y, (ushort)(z + 1))); PhysWater(PosToInt(x, y, (ushort)(z - 1))); PhysWater(PosToInt(x, (ushort)(y - 1), z)); } else { AddUpdate(C.b, Block.air); //was placed near sponge } C.time = 255; break; case Block.lava: //Active_lava //initialy checks if block is valid if (C.time >= 4) { PhysLava(PosToInt((ushort)(x + 1), y, z), Block.lava); PhysLava(PosToInt((ushort)(x - 1), y, z), Block.lava); PhysLava(PosToInt(x, y, (ushort)(z + 1)), Block.lava); PhysLava(PosToInt(x, y, (ushort)(z - 1)), Block.lava); PhysLava(PosToInt(x, (ushort)(y - 1), z), Block.lava); C.time = 255; } else { C.time++; } break; case Block.sand: //Sand if (PhysSand(C.b, Block.sand)) { PhysAir(PosToInt((ushort)(x + 1), y, z)); PhysAir(PosToInt((ushort)(x - 1), y, z)); PhysAir(PosToInt(x, y, (ushort)(z + 1))); PhysAir(PosToInt(x, y, (ushort)(z - 1))); PhysAir(PosToInt(x, (ushort)(y + 1), z)); //Check block above } C.time = 255; break; case Block.gravel: //Gravel if (PhysSand(C.b, Block.gravel)) { PhysAir(PosToInt((ushort)(x + 1), y, z)); PhysAir(PosToInt((ushort)(x - 1), y, z)); PhysAir(PosToInt(x, y, (ushort)(z + 1))); PhysAir(PosToInt(x, y, (ushort)(z - 1))); PhysAir(PosToInt(x, (ushort)(y + 1), z)); //Check block above } C.time = 255; break; case Block.sponge: //SPONGE PhysSponge(C.b); C.time = 255; break; //Adv physics updating anything placed next to water or lava case Block.wood: //Wood to die in lava case Block.shrub: //Tree and plants follow case Block.trunk: //Wood to die in lava case Block.leaf: //Bushes die in lava case Block.yellowflower: case Block.redflower: case Block.mushroom: case Block.redmushroom: case Block.bookcase: //bookcase if (Physics == Physics.Advanced) //Adv physics kills flowers and mushroos in water/lava { PhysAir(PosToInt((ushort)(x + 1), y, z)); PhysAir(PosToInt((ushort)(x - 1), y, z)); PhysAir(PosToInt(x, y, (ushort)(z + 1))); PhysAir(PosToInt(x, y, (ushort)(z - 1))); PhysAir(PosToInt(x, (ushort)(y + 1), z)); //Check block above } C.time = 255; break; case Block.staircasestep: PhysStair(C.b); C.time = 255; break; case Block.wood_float: //wood_float PhysFloatwood(C.b); C.time = 255; break; case Block.lava_fast: //lava_fast //initialy checks if block is valid PhysLava(PosToInt((ushort)(x + 1), y, z), Block.lava_fast); PhysLava(PosToInt((ushort)(x - 1), y, z), Block.lava_fast); PhysLava(PosToInt(x, y, (ushort)(z + 1)), Block.lava_fast); PhysLava(PosToInt(x, y, (ushort)(z - 1)), Block.lava_fast); PhysLava(PosToInt(x, (ushort)(y - 1), z), Block.lava_fast); C.time = 255; break; //Special blocks that are not saved case Block.air_flood: //air_flood if (C.time < 1) { PhysAirFlood(PosToInt((ushort)(x + 1), y, z), Block.air_flood); PhysAirFlood(PosToInt((ushort)(x - 1), y, z), Block.air_flood); PhysAirFlood(PosToInt(x, y, (ushort)(z + 1)), Block.air_flood); PhysAirFlood(PosToInt(x, y, (ushort)(z - 1)), Block.air_flood); PhysAirFlood(PosToInt(x, (ushort)(y - 1), z), Block.air_flood); PhysAirFlood(PosToInt(x, (ushort)(y + 1), z), Block.air_flood); C.time++; } else { AddUpdate(C.b, 0); //Turn back into normal air C.time = 255; } break; case Block.air_flood_layer: //air_flood_layer if (C.time < 1) { PhysAirFlood(PosToInt((ushort)(x + 1), y, z), Block.air_flood_layer); PhysAirFlood(PosToInt((ushort)(x - 1), y, z), Block.air_flood_layer); PhysAirFlood(PosToInt(x, y, (ushort)(z + 1)), Block.air_flood_layer); PhysAirFlood(PosToInt(x, y, (ushort)(z - 1)), Block.air_flood_layer); C.time++; } else { AddUpdate(C.b, 0); //Turn back into normal air C.time = 255; } break; case Block.air_flood_down: //air_flood_down if (C.time < 1) { PhysAirFlood(PosToInt((ushort)(x + 1), y, z), Block.air_flood_down); PhysAirFlood(PosToInt((ushort)(x - 1), y, z), Block.air_flood_down); PhysAirFlood(PosToInt(x, y, (ushort)(z + 1)), Block.air_flood_down); PhysAirFlood(PosToInt(x, y, (ushort)(z - 1)), Block.air_flood_down); PhysAirFlood(PosToInt(x, (ushort)(y - 1), z), Block.air_flood_down); C.time++; } else { AddUpdate(C.b, 0); //Turn back into normal air C.time = 255; } break; case Block.air_flood_up: //air_flood_up if (C.time < 1) { PhysAirFlood(PosToInt((ushort)(x + 1), y, z), Block.air_flood_up); PhysAirFlood(PosToInt((ushort)(x - 1), y, z), Block.air_flood_up); PhysAirFlood(PosToInt(x, y, (ushort)(z + 1)), Block.air_flood_up); PhysAirFlood(PosToInt(x, y, (ushort)(z - 1)), Block.air_flood_up); PhysAirFlood(PosToInt(x, (ushort)(y + 1), z), Block.air_flood_up); C.time++; } else { AddUpdate(C.b, 0); //Turn back into normal air C.time = 255; } break; default: //non special blocks are then ignored, maybe it would be better to avoid getting here and cutting down the list //C.time = 255; extraPhysicsCheck = true; // HANDLE DOORS - Otherwise, this would require ~50 case statements if (extraPhysicsCheck) { for (int i = 0; i < doors.doorBlocks.Length; i++) { extraPhysicsCheck = false; if (blocks[C.b] == doors.doorAirBlocks[i]) { if (C.time == 0) { PhysReplace(PosToInt((ushort)(x + 1), y, z), doors.doorBlocks[i], doors.doorAirBlocks[i]); PhysReplace(PosToInt((ushort)(x - 1), y, z), doors.doorBlocks[i], doors.doorAirBlocks[i]); PhysReplace(PosToInt(x, y, (ushort)(z + 1)), doors.doorBlocks[i], doors.doorAirBlocks[i]); PhysReplace(PosToInt(x, y, (ushort)(z - 1)), doors.doorBlocks[i], doors.doorAirBlocks[i]); PhysReplace(PosToInt(x, (ushort)(y - 1), z), doors.doorBlocks[i], doors.doorAirBlocks[i]); PhysReplace(PosToInt(x, (ushort)(y + 1), z), doors.doorBlocks[i], doors.doorAirBlocks[i]); } if (C.time < 16) { C.time++; } else { AddUpdate(C.b, doors.doorBlocks[i]); //turn back into door C.time = 255; } break; } } } else { C.time = 255; } // Ignore the block, no physics required break; } } catch { ListCheck.Remove(C); Player.GlobalMessage("Phys check issue"); } }); ListCheck.RemoveAll(Check => Check.time == 255); //Remove all that are finished with 255 time ListUpdate.ForEach(delegate(Update C) //checks though each block to be updated and does so { try { IntToPos(C.b, out x, out y, out z); Blockchange(x, y, z, C.type); } catch { Logger.Log("Phys update issue", LogType.Error); } System.Threading.Thread.Sleep(1); // Attempt to slow down physics just a tad }); ListUpdate.Clear(); } } catch { Logger.Log("Map physics error", LogType.Error); } }
public void CalcPhysics() { if (physics == 0) { return; } try { ushort x, y, z; lastCheck = ListCheck.Count; if (physics == 5) { for (int i = 0; i < ListCheck.Count; i++) { Check C = ListCheck.Items[i]; IntToPos(C.b, out x, out y, out z); try { if (PhysicsUpdate != null) { PhysicsUpdate(x, y, z, C.data, this); } if ((C.data.Raw & 0x3F) == 0 || ExtraInfoPhysics.DoDoorsOnly(this, ref C, null)) { Block.HandlePhysics handler = Block.physicsDoorsHandlers[blocks[C.b]]; if (handler != null) { handler(this, ref C); } else if ((C.data.Raw & 0x3F) == 0 || !C.data.HasWait) { C.data.Data = 255; } } ListCheck.Items[i] = C; } catch { listCheckExists.Set(x, y, z, false); ListCheck.RemoveAt(i); } } } else { for (int i = 0; i < ListCheck.Count; i++) { Check C = ListCheck.Items[i]; IntToPos(C.b, out x, out y, out z); try { if (PhysicsUpdate != null) { PhysicsUpdate(x, y, z, C.data, this); } if (OnPhysicsUpdateEvent.events.Count > 0) { OnPhysicsUpdateEvent.Call(x, y, z, C.data, this); } if ((C.data.Raw & 0x3F) == 0 || ExtraInfoPhysics.DoComplex(this, ref C)) { Block.HandlePhysics handler = Block.physicsHandlers[blocks[C.b]]; if (handler != null) { handler(this, ref C); } else if ((C.data.Raw & 0x3F) == 0 || !C.data.HasWait) { C.data.Data = 255; } } ListCheck.Items[i] = C; } catch { listCheckExists.Set(x, y, z, false); ListCheck.RemoveAt(i); } } } RemoveExpiredChecks(); lastUpdate = ListUpdate.Count; if (ListUpdate.Count > 0 && bulkSender == null) { bulkSender = new BufferedBlockSender(this); } for (int i = 0; i < ListUpdate.Count; i++) { Update C = ListUpdate.Items[i]; try { byte type = C.data.Data; C.data.Data = 0; if (DoPhysicsBlockchange(C.b, type, false, C.data, 0, true)) { bulkSender.Add(C.b, type, 0); } } catch { Server.s.Log("Phys update issue"); } bulkSender.CheckIfSend(false); } if (bulkSender != null) { bulkSender.CheckIfSend(true); } ListUpdate.Clear(); listUpdateExists.Clear(); } catch (Exception e) { Server.s.Log("Level physics error"); Server.ErrorLog(e); } }
public void CalcPhysics() { ushort x, y, z; lastCheck = ListCheck.Count; const uint mask = PhysicsArgs.TypeMask; HandlePhysics[] handlers = BlockBehaviour.physicsHandlers; ExtraInfoHandler extraHandler = ExtraInfoPhysics.DoNormal; if (physics == 5) { handlers = BlockBehaviour.physicsDoorsHandlers; extraHandler = ExtraInfoPhysics.DoDoorsOnly; } for (int i = 0; i < ListCheck.Count; i++) { Check C = ListCheck.Items[i]; IntToPos(C.b, out x, out y, out z); try { if (PhysicsUpdate != null) { PhysicsUpdate(x, y, z, C.data, this); } OnPhysicsUpdateEvent.Call(x, y, z, C.data, this); if ((C.data.Raw & mask) == 0 || extraHandler(this, ref C)) { HandlePhysics handler = handlers[blocks[C.b]]; if (handler != null) { handler(this, ref C); } else if ((C.data.Raw & mask) == 0 || !C.data.HasWait) { C.data.Data = PhysicsArgs.RemoveFromChecks; } } ListCheck.Items[i] = C; } catch { listCheckExists.Set(x, y, z, false); ListCheck.RemoveAt(i); } } RemoveExpiredChecks(); lastUpdate = ListUpdate.Count; if (ListUpdate.Count > 0 && bulkSender == null) { bulkSender = new BufferedBlockSender(this); } for (int i = 0; i < ListUpdate.Count; i++) { Update C = ListUpdate.Items[i]; try { byte block = C.data.Data, extBlock = 0; C.data.Data = 0; // Is the Ext flag just an indicator for the block update? if (C.data.ExtBlock && (C.data.Raw & PhysicsArgs.TypeMask) == 0) { extBlock = block; block = Block.custom_block; C.data.ExtBlock = false; } if (DoPhysicsBlockchange(C.b, block, false, C.data, extBlock, true)) { bulkSender.Add(C.b, block, extBlock); } } catch { Server.s.Log("Phys update issue"); } } if (bulkSender != null) { bulkSender.Send(true); } ListUpdate.Clear(); listUpdateExists.Clear(); }
public void CalcPhysics() { ushort x, y, z; lastCheck = ListCheck.Count; const uint mask = PhysicsArgs.TypeMask; HandlePhysics[] handlers = physicsHandlers; ExtraInfoHandler extraHandler = ExtraInfoPhysics.DoNormal; if (physics == 5) { handlers = physicsDoorsHandlers; extraHandler = ExtraInfoPhysics.DoDoorsOnly; } for (int i = 0; i < ListCheck.Count; i++) { Check C = ListCheck.Items[i]; IntToPos(C.b, out x, out y, out z); try { if (OnPhysicsUpdateEvent.handlers.Count > 0) { OnPhysicsUpdateEvent.Call(x, y, z, C.data, this); } if ((C.data.Raw & mask) == 0 || extraHandler(this, ref C)) { int idx = blocks[C.b]; if (idx == Block.custom_block) { idx = Block.Count + GetExtTileNoCheck(x, y, z); } HandlePhysics handler = handlers[idx]; if (handler != null) { handler(this, ref C); } else if ((C.data.Raw & mask) == 0 || !C.data.HasWait) { C.data.Data = PhysicsArgs.RemoveFromChecks; } } ListCheck.Items[i] = C; } catch { listCheckExists.Set(x, y, z, false); ListCheck.RemoveAt(i); } } RemoveExpiredChecks(); lastUpdate = ListUpdate.Count; if (ListUpdate.Count > 0 && bulkSender == null) { bulkSender = new BufferedBlockSender(this); } ExtBlock block; for (int i = 0; i < ListUpdate.Count; i++) { Update C = ListUpdate.Items[i]; try { block.BlockID = C.data.Data; block.ExtID = 0; C.data.Data = 0; // Is the Ext flag just an indicator for the block update? if (C.data.ExtBlock && (C.data.Raw & PhysicsArgs.TypeMask) == 0) { block.ExtID = block.BlockID; block.BlockID = Block.custom_block; C.data.ExtBlock = false; } if (DoPhysicsBlockchange(C.b, block, false, C.data, true)) { bulkSender.Add(C.b, block.BlockID, block.ExtID); } } catch { Logger.Log(LogType.Warning, "Phys update issue"); } } if (bulkSender != null) { bulkSender.Send(true); } ListUpdate.Clear(); listUpdateExists.Clear(); }