Remove usage of entityObj from Destroy event

`entityObj` is not available on clients which just have rejoined. As not
all clients have access to it the data shouldn't be used for anything
elaborate.
This commit is contained in:
phosit 2025-09-13 19:15:32 +02:00
parent 0a2294171e
commit b6243966f3
No known key found for this signature in database
GPG key ID: C9430B600671C268
4 changed files with 10 additions and 20 deletions

View file

@ -40,14 +40,11 @@ PetraBot.prototype.CustomInit = function(gameState)
{
for (const i in this.savedEvents[key])
{
if (!this.savedEvents[key][i].entityObj)
continue;
const evt = this.savedEvents[key][i];
const evtmod = {};
for (const keyevt in evt)
{
evtmod[keyevt] = evt[keyevt];
evtmod.entityObj = new Entity(gameState.sharedScript, evt.entityObj);
this.savedEvents[key][i] = evtmod;
}
}
@ -143,13 +140,13 @@ PetraBot.prototype.Serialize = function()
savedEvents[key] = this.savedEvents[key].slice();
for (const i in savedEvents[key])
{
if (!savedEvents[key][i] || !savedEvents[key][i].entityObj)
if (!savedEvents[key][i])
continue;
const evt = savedEvents[key][i];
const evtmod = {};
for (const keyevt in evt)
evtmod[keyevt] = evt[keyevt];
evtmod.entityObj = evt.entityObj._entity;
evtmod.entityObj = undefined;
savedEvents[key][i] = evtmod;
}
}

View file

@ -135,23 +135,18 @@ BasesManager.prototype.checkEvents = function(gameState, events)
for (const evt of events.Destroy)
{
// Let's check we haven't lost an important building here.
if (evt && !evt.SuccessfulFoundation && evt.entityObj && evt.metadata && evt.metadata[PlayerID] &&
evt.metadata[PlayerID].base)
if (evt && !evt.SuccessfulFoundation && evt.metadata?.[PlayerID]?.base)
{
const ent = evt.entityObj;
if (evt?.metadata?.[PlayerID]?.assignedResource)
{
this.getBaseByID(evt.metadata[PlayerID].base)
.removeFromAssignedDropsite(evt.entity);
}
if (ent.owner() != PlayerID)
continue;
// A new base foundation was created and destroyed on the same (AI) turn
if (evt.metadata[PlayerID].base == -1 || evt.metadata[PlayerID].base == -2)
continue;
const base = this.getBaseByID(evt.metadata[PlayerID].base);
if (ent.resourceDropsiteTypes() && ent.hasClass("Structure"))
base.removeDropsite(gameState, evt.entity);
base.removeDropsite(gameState, evt.entity);
if (evt.metadata[PlayerID].baseAnchor && evt.metadata[PlayerID].baseAnchor === true)
base.anchorLost(gameState);
}

View file

@ -563,10 +563,9 @@ DefenseArmy.prototype.checkEvents = function(gameState, events)
for (const evt of events.Destroy)
{
const entityObj = evt.entityObj || undefined;
// we may have capture+destroy, so do not trust owner and check all possibilities
this.removeOwn(gameState, evt.entity, entityObj);
this.removeFoe(gameState, evt.entity, entityObj);
this.removeOwn(gameState, evt.entity);
this.removeFoe(gameState, evt.entity);
}
};

View file

@ -288,15 +288,14 @@ NavalManager.prototype.checkEvents = function(gameState, queues, events)
for (const evt of events.Destroy)
{
if (!evt.entityObj || evt.entityObj.owner() !== PlayerID || !evt.metadata || !evt.metadata[PlayerID])
const transporter = evt.metadata?.[PlayerID]?.transporter;
if (!transporter)
continue;
if (!evt.entityObj.hasClass("Ship") || !evt.metadata[PlayerID].transporter)
continue;
const plan = this.getPlan(evt.metadata[PlayerID].transporter);
const plan = this.getPlan(transporter);
if (!plan)
continue;
const shipId = evt.entityObj.id();
const shipId = evt.entity;
if (this.Config.debug > 1)
{
aiWarn("one ship " + shipId + " from plan " + plan.ID + " destroyed during " +