From 610e80f098052c35ed826001075ff043e75ccc99 Mon Sep 17 00:00:00 2001 From: obligaron Date: Sun, 13 Nov 2022 20:40:31 +0100 Subject: [PATCH] Sync break crux --- Source/missiles.cpp | 2 +- Source/objects.cpp | 20 ++++++++++++++------ Source/objects.h | 2 +- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/Source/missiles.cpp b/Source/missiles.cpp index b835d174f..f0c2c949b 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -446,7 +446,7 @@ void CheckMissileCol(Missile &missile, int minDamage, int maxDamage, bool isDama if (IsMissileBlockedByTile({ mx, my })) { Object *object = FindObjectAtPosition({ mx, my }); if (object != nullptr && object->IsBreakable()) { - BreakObjectMissile(*object); + BreakObjectMissile(missile.sourcePlayer(), *object); } if (!dontDeleteOnCollision) diff --git a/Source/objects.cpp b/Source/objects.cpp index 01e7c4176..b118ec6dc 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -3432,7 +3432,7 @@ bool AreAllCruxesOfTypeBroken(int cruxType) return true; } -void BreakCrux(Object &crux) +void BreakCrux(const Player *player, Object &crux) { crux._oAnimFlag = true; crux._oAnimFrame = 1; @@ -3442,6 +3442,9 @@ void BreakCrux(Object &crux) crux._oBreak = -1; crux._oSelFlag = 0; + if (player == MyPlayer || player == nullptr) + NetSendCmdLoc(MyPlayerId, false, CMD_BREAKOBJ, crux.position); + if (!AreAllCruxesOfTypeBroken(crux._oVar8)) return; @@ -4616,32 +4619,37 @@ void SyncOpObject(Player &player, int cmd, Object &object) } } -void BreakObjectMissile(Object &object) +void BreakObjectMissile(const Player *player, Object &object) { if (object.IsCrux()) - BreakCrux(object); + BreakCrux(player, object); } void BreakObject(const Player &player, Object &object) { if (object.IsBarrel()) { BreakBarrel(player, object, false, true); } else if (object.IsCrux()) { - BreakCrux(object); + BreakCrux(&player, object); } } void DeltaSyncBreakObj(Object &object) { - if (!object.IsBarrel() || object._oSelFlag == 0) + if (!object.IsBreakable() || object._oSelFlag == 0) return; - object._oSolidFlag = false; object._oMissFlag = true; object._oBreak = -1; object._oSelFlag = 0; object._oPreFlag = true; object._oAnimFlag = false; object._oAnimFrame = object._oAnimLen; + + if (object.IsBarrel()) { + object._oSolidFlag = false; + } else if (object.IsCrux() && AreAllCruxesOfTypeBroken(object._oVar8)) { + ObjChangeMap(object._oVar1, object._oVar2, object._oVar3, object._oVar4); + } } void SyncBreakObj(const Player &player, Object &object) diff --git a/Source/objects.h b/Source/objects.h index f144efde3..4b4e787d9 100644 --- a/Source/objects.h +++ b/Source/objects.h @@ -319,7 +319,7 @@ void ObjChangeMapResync(int x1, int y1, int x2, int y2); _item_indexes ItemMiscIdIdx(item_misc_id imiscid); void OperateObject(Player &player, Object &object); void SyncOpObject(Player &player, int cmd, Object &object); -void BreakObjectMissile(Object &object); +void BreakObjectMissile(const Player *player, Object &object); void BreakObject(const Player &player, Object &object); void DeltaSyncOpObject(Object &object); void DeltaSyncBreakObj(Object &object);