From dbc1a055676d5598a98fb286a2143906ce054f50 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Sun, 1 Mar 2026 16:03:05 +0200 Subject: [PATCH] bugfix for unloaded land force not moving towards the spawn point --- Assets/Scripts/Core/player.lua | 39 ++++++++++++++++++++-------------- gameManager.cpp | 2 ++ unit.cpp | 11 ++++++++++ unit.h | 2 ++ 4 files changed, 38 insertions(+), 16 deletions(-) diff --git a/Assets/Scripts/Core/player.lua b/Assets/Scripts/Core/player.lua index db1ca50..7c9c38c 100644 --- a/Assets/Scripts/Core/player.lua +++ b/Assets/Scripts/Core/player.lua @@ -512,20 +512,27 @@ function Player:boardTransports(arguments) if not transports[1] then return BTNodeResult.FAILURE end map = Map.getSingleton() - currTransportCell = map:getCell(map:getCellId(transports[1]:getPos(), false)) + tpPos = transports[1]:getPos() + currTransportCell = map:getCell(map:getCellId(tpPos, false)) + + spId = self.taskForces[arguments.taskForceId].spawnPointId + embarkCell = map:getCell(self.spawnPointData[spId + 1].embarkCellId) + disembarkCell = map:getCell(self.spawnPointData[spId + 1].disembarkCellId) if transports[1]:getNumOrders() == 0 and currTransportCell.type == 1 then self:deselectUnits() self:selectUnits(transports) - self:issueOrder(OrderType.MOVE, Vector3:new(0, 0, 0), {Target:new(nil, map:getSpawnPoint(self:getSpawnPointId()))}, false) - elseif currTransportCell.type == 0 and not self.taskForces[arguments.taskForceId].moving then - self:deselectUnits() - self:selectUnits(transports) - self:haltUnits() - self:deselectUnits() - self:selectUnits(self.taskForces[arguments.taskForceId].units) - self:issueOrder(OrderType.GARRISON, Vector3:new(0, 0, 0), {Target:new(transports[1]:toGameObject(), Vector3:new(0, 0, 0))}, false) - self.taskForces[arguments.taskForceId].moving = true + self:issueOrder(OrderType.MOVE, Vector3:new(0, 0, 0), {Target:new(nil, embarkCell.pos)}, false) + elseif currTransportCell.type == 0 then + closerToDisembark = (tpPos:getDistanceFrom(disembarkCell.pos) < tpPos:getDistanceFrom(embarkCell.pos)) + + if closerToDisembark then return BTNodeResult.SUCCESS + elseif not self.taskForces[arguments.taskForceId].moving then + self:deselectUnits() + self:selectUnits(self.taskForces[arguments.taskForceId].units) + self:issueOrder(OrderType.GARRISON, Vector3:new(0, 0, 0), {Target:new(transports[1]:toGameObject(), Vector3:new(0, 0, 0))}, false) + self.taskForces[arguments.taskForceId].moving = true + end end garrisonSlots = transports[1]:getGarrisonSlots() @@ -542,6 +549,9 @@ end function Player:moveTransports(arguments) transports = self:getUnitsByClass(UnitClass.TRANSPORT, -1) + + if transports[1]:isGarrisonEmpty() then return BTNodeResult.SUCCESS end + map = Map.getSingleton() spId = self.taskForces[arguments.taskForceId].spawnPointId @@ -554,16 +564,13 @@ function Player:moveTransports(arguments) self:deselectUnits() self:selectUnits(transports) - targ = Target:new(nil, map:getCell(self.spawnPointData[spId + 1].disembarkCellId).pos) - self:issueOrder(OrderType.MOVE, Vector3:new(0, 0, 0), {targ}, false) + + targPos = map:getCell(self.spawnPointData[spId + 1].disembarkCellId).pos + self:issueOrder(OrderType.MOVE, Vector3:new(0, 0, 0), {Target:new(nil, targPos)}, false) return BTNodeResult.RUNNING end -function Player:unloadTransports(arguments) - return BTNodeResult.FAILURE -end - function Player:occupySpawnPoint(arguments) tfId = arguments.taskForceId diff --git a/gameManager.cpp b/gameManager.cpp index 652524a..6a28239 100755 --- a/gameManager.cpp +++ b/gameManager.cpp @@ -70,7 +70,9 @@ namespace battleship{ "setState", &Unit::setState, "getDestructable", &Unit::getDestructable, "getGarrisonSlots", &Unit::getGarrisonSlots, + "getNumFreeGarrisonSlots", &Unit::getNumFreeGarrisonSlots, "getNumGarrisonSlots", &Unit::getNumGarrisonSlots, + "isGarrisonEmpty", &Unit::isGarrisonEmpty, "getOrder", &Unit::getOrder, "getNumOrders", &Unit::getNumOrders, "getPos", &GameObject::getPos, diff --git a/unit.cpp b/unit.cpp index a5bc534..02a550f 100755 --- a/unit.cpp +++ b/unit.cpp @@ -171,6 +171,15 @@ namespace battleship{ delete losLightNode; losLightNode = nullptr; } + + int Unit::getNumFreeGarrisonSlots(){ + int numFreeSlots = 0; + + for(GarrisonSlot &slot : garrisonSlots) + if(!slot.vehicle) numFreeSlots++; + + return numFreeSlots; + } void Unit::destroySound(){ selectionSfx->stop(); @@ -468,6 +477,8 @@ namespace battleship{ if(order.type == Order::TYPE::BUILD && order.targets[0].unit) player->addUnit((Unit*)order.targets[0].unit); + + executeOrders(); } void Unit::halt() { diff --git a/unit.h b/unit.h index 2da7709..8b494c8 100755 --- a/unit.h +++ b/unit.h @@ -118,6 +118,7 @@ namespace battleship{ bool canGarrison(Vehicle*); void initLosLight(); void destroyLosLight(); + int getNumFreeGarrisonSlots(); inline void setState(State s){state = s;} inline State getState(){return state;} inline Engineer* toEngineer(){return (Engineer*)this;} @@ -127,6 +128,7 @@ namespace battleship{ inline PointDefense* toPointDefense(){return (PointDefense*)this;} inline GameObject* toGameObject(){return (GameObject*)this;} inline int getNumGarrisonSlots(){return garrisonSlots.size();} + inline bool isGarrisonEmpty(){return getNumFreeGarrisonSlots() == getNumGarrisonSlots();} inline const std::vector& getGarrisonSlots(){return garrisonSlots;} inline float getLineOfSight() {return lineOfSight;} inline UnitType getType() {return type;}