protected void FindRadius(Player ignore, float damage) { // test for radius damage SphereShape s = new SphereShape(); s.SetRadius(_areaOfEffectRadius); // Get space and state of the subject body RID space = PhysicsServer.BodyGetSpace(this.GetRid()); PhysicsDirectSpaceState state = PhysicsServer.SpaceGetDirectState(space); // Setup shape query parameters PhysicsShapeQueryParameters par = new PhysicsShapeQueryParameters(); par.SetShapeRid(s.GetRid()); par.Transform = this.Transform; Godot.Collections.Array result = state.IntersectShape(par); foreach (Dictionary <object, object> r in result) { if (r["collider"] is Player pl) { GD.Print("found player"); if (pl != ignore || ignore == null) { // find how far from explosion as a percentage, apply to damage float dist = this.Transform.origin.DistanceTo(pl.Transform.origin); dist = dist > this._areaOfEffectRadius ? (this._areaOfEffectRadius * .99f) : dist; float pc = ((this._areaOfEffectRadius - dist) / this._areaOfEffectRadius); float d = damage * pc; GD.Print("dam: " + damage); GD.Print("pc: " + pc); GD.Print("dist: " + dist); GD.Print("aoe: " + this._areaOfEffectRadius); GD.Print(this._playerOwner.GetName()); GD.Print(pl.GetName()); if (pl == this._playerOwner) { d = d * 0.5f; } GD.Print("inflicted dam: " + d); // inflict damage pl.TakeDamage(this.Transform, _weaponOwnerString, _weaponOwnerInflictLength, this._playerOwner, d); } } } }
protected Godot.Collections.Array FindPlayersInRadius() { SphereShape s = new SphereShape(); s.SetRadius(_areaOfEffectRadius); // Get space and state of the subject body RID space = PhysicsServer.BodyGetSpace(this.GetRid()); PhysicsDirectSpaceState state = PhysicsServer.SpaceGetDirectState(space); // Setup shape query parameters PhysicsShapeQueryParameters par = new PhysicsShapeQueryParameters(); par.SetShapeRid(s.GetRid()); par.Transform = this.Transform; Godot.Collections.Array result = state.IntersectShape(par); return(result); }