// Damage and hurl objects away. // documented in /docs/sdk/script/fn global func BlastObjects(int x, int y, int level, object container, int cause_plr, int damage_level, object layer, object prev_container) { var obj; // Coordinates are always supplied globally, convert to local coordinates. var l_x = x - GetX(), l_y = y - GetY(); // caused by: if not specified, controller of calling object if (cause_plr == nil) if (this) cause_plr = GetController(); // damage: if not specified this is the same as the explosion radius if (damage_level == nil) damage_level = level; // In a container? if (container) { if (container->GetObjectLayer() == layer) { container->BlastObject(damage_level, cause_plr); if (!container) return true; // Container could be removed in the meanwhile. for (obj in FindObjects(Find_Container(container), Find_Layer(layer), Find_Exclude(prev_container))) if (obj) obj->BlastObject(damage_level, cause_plr); } }
global func FxHitCheckDoCheck(object target, proplist effect) { var obj; // rather search in front of the projectile, since a hit might delete the effect, // and clonks can effectively hide in front of walls. var oldx = target->GetX(); var oldy = target->GetY(); var newx = target->GetX() + target->GetXDir() / 10; var newy = target->GetY() + target->GetYDir() / 10; var dist = Distance(oldx, oldy, newx, newy); var is_human = GetPlayerType(target->GetController()) == C4PT_User; var shooter = effect.shooter; var live = effect.live; if (live) shooter = target; if (dist <= Max(1, Max(Abs(target->GetXDir()), Abs(target->GetYDir()))) * 2) { // We search for objects along the line on which we moved since the last check // and sort by distance (closer first). for (obj in FindObjects(Find_OnLine(oldx, oldy, newx, newy), Find_NoContainer(), Find_Layer(target->GetObjectLayer()), Find_PathFree(target), Sort_Distance(oldx, oldy))) { // Excludes if (!obj) continue; // hit callback of one object might have removed other objects if(obj == target) continue; if(obj == shooter) continue; if (is_human) { if (obj == g_windgen1) continue; if (obj == g_windgen2) continue; if (obj == g_windgen3) continue; if (obj == g_windmill) continue; } // Unlike in hazard, there is no NOFF rule (yet) // CheckEnemy //if(!CheckEnemy(obj,target)) continue; // IsProjectileTarget or Alive will be hit if (obj->~IsProjectileTarget(target, shooter) || obj->GetOCF() & OCF_Alive) { target->~HitObject(obj); if (!target) return; } } } return; }
global func BlastObjectsBlue(int x, int y, int level, object container, int cause_plr, object layer) { var obj; // Coordinates are always supplied globally, convert to local coordinates. var l_x = x - GetX(), l_y = y - GetY(); // In a container? if (container) { if (container->GetObjectLayer() == layer) { container->BlastObject(level, cause_plr); if (!container) return true; // Container could be removed in the meanwhile. for (obj in FindObjects(Find_Container(container), Find_Layer(layer))) if (obj) obj->BlastObject(level, cause_plr); } }