mirror of
https://github.com/AquariaOSE/Aquaria.git
synced 2024-11-25 09:44:02 +00:00
cleanup legacy entity targets; don't allocate 10 slots up front since barely any entity uses even slot 0
Also fix probably wrong target check in entity_hurtTarget()
This commit is contained in:
parent
ed5cd03a06
commit
5a9025a2a7
3 changed files with 42 additions and 49 deletions
|
@ -206,7 +206,6 @@ Entity::Entity()
|
|||
multColor = Vector(1,1,1);
|
||||
collideRadius = 24;
|
||||
entityType = EntityType(0);
|
||||
targets.resize(10);
|
||||
|
||||
frozenTimer = 0;
|
||||
canBeTargetedByAvatar = false;
|
||||
|
@ -489,11 +488,8 @@ void Entity::stopFollowingPath()
|
|||
position.stopPath();
|
||||
}
|
||||
|
||||
void Entity::flipToTarget(Vector pos)
|
||||
void Entity::flipToPos(Vector pos)
|
||||
{
|
||||
|
||||
|
||||
|
||||
if (pos.x > position.x)
|
||||
{
|
||||
if (!isfh())
|
||||
|
@ -506,21 +502,27 @@ void Entity::flipToTarget(Vector pos)
|
|||
}
|
||||
}
|
||||
|
||||
Entity* Entity::getTargetEntity(int t)
|
||||
Entity* Entity::getTargetEntity(size_t t) const
|
||||
{
|
||||
return targets[t];
|
||||
return t < targets.size() ? targets[t] : NULL;
|
||||
}
|
||||
|
||||
void Entity::setTargetEntity(Entity *e, int t)
|
||||
void Entity::setTargetEntity(Entity *e, size_t t)
|
||||
{
|
||||
if(t < targets.size())
|
||||
{
|
||||
targets[t] = e;
|
||||
return;
|
||||
}
|
||||
|
||||
if(!e)
|
||||
return;
|
||||
|
||||
if(targets.size() <= t)
|
||||
targets.resize(t + 1);
|
||||
targets[t] = e;
|
||||
}
|
||||
|
||||
bool Entity::hasTarget(int t)
|
||||
{
|
||||
return (targets[t]!=0);
|
||||
}
|
||||
|
||||
void Entity::destroy()
|
||||
{
|
||||
if (stopSoundsOnDeath)
|
||||
|
@ -1860,25 +1862,21 @@ EntityType Entity::getEntityType()
|
|||
return entityType;
|
||||
}
|
||||
|
||||
/* types:
|
||||
|
||||
*/
|
||||
Entity *Entity::findTarget(int dist, int type, int t)
|
||||
Entity *Entity::findTarget(int dist, int type, size_t t)
|
||||
{
|
||||
targets[t] = 0;
|
||||
Entity *target = NULL;
|
||||
|
||||
if (type == ET_AVATAR)
|
||||
{
|
||||
Vector d = game->avatar->position - this->position;
|
||||
if (d.getSquaredLength2D() < sqr(dist))
|
||||
{
|
||||
targets[t] = game->avatar;
|
||||
target = game->avatar;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int closestDist = -1;
|
||||
Entity *target = 0;
|
||||
FOR_ENTITIES(i)
|
||||
{
|
||||
Entity *e = *i;
|
||||
|
@ -1892,12 +1890,10 @@ Entity *Entity::findTarget(int dist, int type, int t)
|
|||
}
|
||||
}
|
||||
}
|
||||
if (target)
|
||||
{
|
||||
targets[t] = target;
|
||||
}
|
||||
}
|
||||
return targets[t];
|
||||
setTargetEntity(target, t);
|
||||
|
||||
return target;
|
||||
}
|
||||
|
||||
void Entity::moveTowards(Vector p, float dt, int spd)
|
||||
|
@ -1930,15 +1926,15 @@ void Entity::moveAroundAngle(int angle, float dt, int spd, int dir)
|
|||
moveAround(p, dt, spd, dir);
|
||||
}
|
||||
|
||||
void Entity::moveTowardsTarget(float dt, int spd, int t)
|
||||
void Entity::moveTowardsTarget(float dt, int spd, size_t t)
|
||||
{
|
||||
if (!targets[t]) return;
|
||||
if (targets.size() < t || !targets[t]) return;
|
||||
moveTowards(targets[t]->position, dt, spd);
|
||||
}
|
||||
|
||||
void Entity::moveAroundTarget(float dt, int spd, int dir, int t)
|
||||
void Entity::moveAroundTarget(float dt, int spd, int dir, size_t t)
|
||||
{
|
||||
if (!targets[t]) return;
|
||||
if (targets.size() < t || !targets[t]) return;
|
||||
moveAround(targets[t]->position, dt, spd, dir);
|
||||
}
|
||||
|
||||
|
|
|
@ -176,8 +176,8 @@ public:
|
|||
void moveTowardsAngle(int angle, float dt, int spd);
|
||||
void moveAroundAngle(int angle, float dt, int spd, int dir);
|
||||
|
||||
void moveTowardsTarget(float dt, int spd, int t=0);
|
||||
void moveAroundTarget(float dt, int spd, int d, int t=0);
|
||||
void moveTowardsTarget(float dt, int spd, size_t t=0);
|
||||
void moveAroundTarget(float dt, int spd, int d, size_t t=0);
|
||||
void moveAroundEntity(float dt, int spd, int d, Entity *e);
|
||||
void moveTowardsGroupCenter(float dt, int spd);
|
||||
void moveTowardsGroupHeading(float dt, int spd);
|
||||
|
@ -185,13 +185,12 @@ public:
|
|||
void doSpellAvoidance(float dt, int range, float mod);
|
||||
void doEntityAvoidance(float dt, int range, float mod, Entity *ignore =0);
|
||||
void setMaxSpeed(float ms);
|
||||
Entity *findTarget(int dist, int type, int t=0);
|
||||
Entity *findTarget(int dist, int type, size_t t=0);
|
||||
|
||||
bool hasTarget(int t=0);
|
||||
bool isTargetInRange(int range, size_t t=0);
|
||||
void doGlint(const Vector &position, const Vector &scale=Vector(2,2), const std::string &tex="Glint", BlendType bt=BLEND_DEFAULT);
|
||||
Entity *getTargetEntity(int t=0);
|
||||
void setTargetEntity(Entity *e, int t=0);
|
||||
Entity *getTargetEntity(size_t t=0) const;
|
||||
void setTargetEntity(Entity *e, size_t t=0);
|
||||
|
||||
virtual void activate(Entity *by, int source){}
|
||||
|
||||
|
@ -199,7 +198,7 @@ public:
|
|||
|
||||
void setEntityType(EntityType et);
|
||||
EntityType getEntityType();
|
||||
void flipToTarget(Vector pos);
|
||||
void flipToPos(Vector pos);
|
||||
bool isFollowingPath();
|
||||
void stopFollowingPath();
|
||||
void overideMaxSpeed(int ms, float time);
|
||||
|
|
|
@ -5990,7 +5990,7 @@ luaFunc(entity_flipToEntity)
|
|||
Entity *e2 = entity(L, 2);
|
||||
if (e && e2)
|
||||
{
|
||||
e->flipToTarget(e2->position);
|
||||
e->flipToPos(e2->position);
|
||||
}
|
||||
luaReturnNil();
|
||||
}
|
||||
|
@ -6002,7 +6002,7 @@ luaFunc(entity_flipToNode)
|
|||
PathNode *n = &p->nodes[0];
|
||||
if (e && n)
|
||||
{
|
||||
e->flipToTarget(n->position);
|
||||
e->flipToPos(n->position);
|
||||
}
|
||||
luaReturnNil();
|
||||
}
|
||||
|
@ -7413,22 +7413,20 @@ luaFunc(entity_setActivationType)
|
|||
luaFunc(entity_hasTarget)
|
||||
{
|
||||
Entity *e = entity(L);
|
||||
if (e)
|
||||
luaReturnBool(e->hasTarget(e->currentEntityTarget));
|
||||
else
|
||||
luaReturnBool(false);
|
||||
luaReturnBool(e && e->getTargetEntity(e->currentEntityTarget));
|
||||
}
|
||||
|
||||
luaFunc(entity_hurtTarget)
|
||||
{
|
||||
Entity *e = entity(L);
|
||||
if (e && e->getTargetEntity())
|
||||
{
|
||||
DamageData d;
|
||||
d.attacker = e;
|
||||
d.damage = lua_tointeger(L, 2);
|
||||
e->getTargetEntity(e->currentEntityTarget)->damage(d);
|
||||
}
|
||||
if (e)
|
||||
if(Entity *t = e->getTargetEntity(e->currentEntityTarget))
|
||||
{
|
||||
DamageData d;
|
||||
d.attacker = e;
|
||||
d.damage = lua_tointeger(L, 2);
|
||||
t->damage(d);
|
||||
}
|
||||
|
||||
luaReturnNil();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue