func CheckForEnemies(Size) { for(var o in FindObjects(Find_Distance(Size), Find_Func("CanBeHit", this))) { if(o->GetOwner() == GetOwner() || GetEffect("BallHitCD", o)) continue; o->AddBallHitEffect(); o->Fling(0, -2); AddEffect("BallHitCD", o, 1, 15); var trailparticles = { Prototype = Particles_ElectroSpark2(), Size = PV_Linear(PV_Random(5,15),0), BlitMode = GFX_BLIT_Additive, Rotation = PV_Random(0,360), R = pR, G = pG, B = pB, }; CreateParticle("Lightning", o->GetX() - GetX(), o->GetY() - GetY(), 0, 0, 10, trailparticles, 5); WeaponDamage(o, SpellDamage); Sound("Ball::ball_hit", false, 50); } }
global func BlackWhite() { var pO; for(pO in FindObjects(Find_NoContainer())) { SetClrModulation(HSL(0,0,0),pO); }
// 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); } }
private func Initialize() { // Create dynamite below the first lava basin DrawMaterialQuad("Tunnel",1378,1327-5,1860,1327-5,1860,1330,1387,1330,1); //Sound("Environment::BirdsLoop",true,100,nil,+1); Cloud->Place(40); PlaceObjects(Rock,50,"Earth"); PlaceObjects(Loam,25,"Earth"); PlaceObjects(Nugget,25,"Earth"); AddEffect("PlaneReset",CreateObjectAbove(Airplane,3030,315,0),100,10,nil,nil); AddEffect("PlaneReset",CreateObjectAbove(Airplane,3160,315,1),100,10,nil,nil); Doors(); var concierge = CreateObjectAbove(Clonk, 70, 1030, NO_OWNER); concierge->SetDir(DIR_Left); concierge->SetAlternativeSkin("Mime"); concierge->SetObjectLayer(concierge); concierge->SetName("$NameConcierge$"); concierge->SetDialogue("Concierge"); concierge->Sound("Circus", false, nil, nil, +1, 100); Dialogue->FindByTarget(concierge)->AddAttention(); var cannons = FindObjects(Find_ID(Cannon)); for (var cannon in cannons) { cannon->TurnCannon(0); cannon->SetCannonAngle(45000); cannon.Touchable = false; }
func FxFireDashStop(object target, proplist effect, int reason, bool temporary) { if(temporary) return; target->Unstuck(); target->SetObjectLayer(nil); target->SetAction("Jump"); ExplosionEffect(effect.Size2, target->GetX(), target->GetY(),0,0,0); for(var o in FindObjects(Find_Distance(effect.Size2, target->GetX(), target->GetY()), Find_Func("CanBeHit", target))) { if(o->GetOwner() == target->GetOwner()) continue; var angle = Angle(target->GetX(), target->GetY(), o->GetX(), o->GetY()); o->AddFireHitEffect(); o->Fling(Sin(angle, 8), -Cos(angle, 8) - 2); target->WeaponDamage(o, effect.SpellDamage2); } target->CastObjects(Flame, RandomX(6,8), RandomX(10,25)); //effect.marker->RemoveObject(); //effect.clonk->MakeHitable(true); }
/** Extract liquid from this @param sznMaterial: Material to extract @param inMaxAmount: Max Amount of Material being extracted @param pnPump: Object which extracts the liquid @param pnPipe: Pipe which extracts the liquid (connected to pnPump) @param bnWildcard: Usefull to extract random liquids; use '*' for sznMaterial for all Materials @return [irMaterial,irAmount] -irMaterial: Material being extracted -irAmount: Amount being extracted */ public func LiquidOutput(string sznMaterial, int inMaxAmount, object pnPump, object pnPipe, bool bnWildcard) { //Search liquid to pump if (bnWildcard) { var ptBarrel = FindObject(Find_Container(this), Find_Func("IsBarrel"), Find_Func("IsBarrelForMaterial", sznMaterial), Find_Not(Find_Func("BarrelIsEmpty"))); var sztMaterial=""; if (ptBarrel) sztMaterial = ptBarrel->GetBarrelMaterial(); //Nothing to pump if (sztMaterial == "") return ["", 0]; sznMaterial = sztMaterial; } var itFound = 0; for (var ptBarrel in FindObjects(Find_Container(this), Find_Func("IsBarrel"), Find_Func("IsBarrelForMaterial", sznMaterial), Find_Not(Find_Func("BarrelIsEmpty")))) { var atFound = ptBarrel->GetLiquid(sznMaterial, inMaxAmount - itFound, this); //Crazy stuff happend? itFound += BoundBy(atFound[1], 0, inMaxAmount - itFound); if (itFound == inMaxAmount) break; } return [sznMaterial, itFound]; }
func DoInit(int first_player) { // Message when first player enters shroom area ScheduleCall(nil, Scenario.ShroomCaveCheck, 21, 0xffffff); // Scorching village g_ruin1->AddScorch(-20,-10, -45, 50, 1500); g_ruin2->AddScorch(-15,42, 90, 50, 1200); g_ruin3->AddScorch(-12,18, 130, 80, 1300); // Horax g_king.JumpSpeed = 200; // Update AI stuff var fx; for (var enemy in FindObjects(Find_ID(Clonk), Find_Owner(NO_OWNER))) if (fx = S2AI->GetAI(enemy)) { fx.weapon = fx.target = nil; S2AI->BindInventory(enemy); enemy->DoEnergy(10000); enemy->AddEnergyBar(); } g_farmer.portrait = { Source=DialogueCastle }; // Start intro if not yet started StartSequence("Intro", 0, GetCrew(first_player)); return true; }
func FxCheckEnemiesTimer(object target, proplist effect, int time) { for(var o in FindObjects(Find_Distance(Size), Find_Not(Find_ID(Hook)), Find_Or(Find_Func("IsReflectable"), Find_Func("CanBeHit", this)))) { if(GetEffect("SawBladeCD", o) || (o->GetOwner() == GetOwner() && time < 15)) { continue; } var angle = Angle(GetX(), GetY(), o->GetX(), o->GetY()); AddEffect("SawBladeCD", o, 1, 25); if(!o->GetAlive()) { if(o->~IsWallElement()) continue; var speed = Distance(0, 0, o->GetXDir(), o->GetYDir()); o->SetVelocity(angle, speed); o->~Blocked(this); WeaponDamage(o, SpellDamage); Sound("Hits::GeneralHit*", false, 50); continue; } Sound("Objects::Weapons::WeaponHit*", false, 50); o->Fling(Sin(angle, 8), -Cos(angle, 8)); WeaponDamage(o, SpellDamage); } }
func RemovePlayer(int iPlr) { for(var obj in FindObjects(Find_Owner(iPlr))) { if(obj) obj->RemoveObject(); } }
func Script200() { TutorialMessage("$TxtNowmakeallclonksletg$"); // Cheat: auto-ungrab all clonks var pClonk; for (pClonk in FindObjects(Find_ID(CLNK))) pClonk->SetAction("Walk"); }
static BOOL GetObjects(ItipAgentClient *client, const char *qID, BongoCalObject **calOut, char **invitationOut) { NmapMimeInfo calInfo = {{0}, }; BOOL haveCal; NmapMimeInfo invitationInfo = {{0}, }; BOOL haveInvitation; char *data; *calOut = NULL; *invitationOut = NULL; if (!FindObjects(client->conn, qID, &calInfo, &haveCal, &invitationInfo, &haveInvitation)) { return FALSE; } if (!haveCal && !haveInvitation) { return FALSE; } if (haveCal) { data = NMAPQueueReadMimePartUTF8(client->conn, qID, &calInfo, -1); if (!data) { return FALSE; } *calOut = BongoCalObjectParseIcalString(data); MemFree(data); } if (haveInvitation) { data = NMAPQueueReadMimePartUTF8(client->conn, qID, &invitationInfo, -1); if (!data) { goto error; } if (BongoJsonValidateString(data) != BONGO_JSON_OK) { MemFree(data); goto error; } *invitationOut = data; } return TRUE; error: if (*calOut) { BongoCalObjectFree(*calOut, TRUE); *calOut = NULL; } return FALSE; }
func Hit() { CastObjects(Flame, RandomX(1,2), RandomX(10,15)); for(var o in FindObjects(Find_Distance(SpellDamage), Find_Func("CanBeHit", this))) { o->AddFireHitEffect(); } Explode(SpellDamage); }
global func ZombieSpawnOff() { var pGrab; for(pGrab in FindObjects(Find_ID(GRAV))) { pGrab -> Disable(); } return(1); }
// macht alle Wegpunkte sichtbar/unsichtbar global func WaypointsVisible(bool visu) { for(var obj in FindObjects(Find_ID(WAYP))) obj->SetVisible(visu); WAYP_visibleWaypoints = visu; if(visu == 1) if(!FindObject2(Find_ID(WPED))) CreateObject(WPED); if(visu == 0) RemoveAll(WPED); }
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 FxDefManaTimer() { for(var o in FindObjects(Find_ID(Clonk))) { var plr = o->GetOwner(); if(GetPlayerTeam(plr) == 1 && o->GetX() < LandscapeWidth()/2) o->DoMagicEnergy(1); if(GetPlayerTeam(plr) == 2 && o->GetX() > LandscapeWidth()/2) o->DoMagicEnergy(1); }
// called every 10 frames after plane+oil task has been given func CheckOilAtPlane() { var barrel; for (var plane in FindObjects(Find_ID(Plane))) if (barrel = plane->FindObject(plane->Find_AtRect(-30,-10,60,20), Find_ID(MetalBarrel))) { RemoveTimer(Scenario.CheckOilAtPlane); ScheduleCall(nil, Global.GameCall, 1,1, "OnPlaneLoaded", plane, barrel); } return true; }
func Timer() { if(!Enabled) return(); DrawParticleLine("MSpark", -10, 0, -10,LandscapeHeight(), 10, 100, RGBa(255,50,50,50), RGBa(255,255,50,100), -10); DrawParticleLine("MSpark", 10, 0, 10,LandscapeHeight(), 10, 100, RGBa(255,50,50,50), RGBa(255,255,50,100), -10); var pObj; for(pObj in FindObjects(Find_InRect(-10,-500,20,LandscapeHeight() + 1000))) { SetXDir(GetXDir(pObj) * -2,pObj); SetYDir(GetYDir(pObj) * -2,pObj); } }
func Intro_2() { // Wait until balloon has dropped var all_balloons = FindObjects(Find_ID(BalloonDeployed)), balloon; if (GetHero()) this.balloon = GetHero()->GetActionTarget(); if (this.balloon) { if (this.balloon->GetX() > 330) for (balloon in all_balloons) balloon->ControlLeft(); else if (this.balloon->GetX() < 300) for (balloon in all_balloons) balloon->ControlRight(); else if (GetHero()->GetY() > 310)
func Special2(object clonk, int x, int y, bool released, bool mouseclick, bool abletocast, bool cooldown) { if (released || mouseclick || cooldown) return; var existing = FindObjects(Find_ID(StickyBomb), Find_Owner(clonk->GetOwner())); if (existing) { SoundAt("UI::Click"); for (var bomb in existing) bomb->BlowUp(); return; } }
func InitializePlayer (plr,x,y,bas,team) { // Gebäude in den Besitz for (var obj in FindObjects(Find_Category(C4D_Structure), Find_Owner(NO_OWNER), Find_Distance(300, x,y))) SetOwner(plr, obj); // Hörx ist ein König! if (team == 2) { var obj = GetHiRank (plr); obj->CLNK::Redefine2 (_HRX); SetPortrait ("random", obj, _HRX); SetName ("$Herx$", obj); } // Alle ins Haus! var home; if (team == 2) home = FindObject2(Find_ID(CST3)); else home = FindObject2(Find_ID(HUT3)); for (var mat in FindObjects(Find_Category(C4D_Object | C4D_Vehicle | C4D_Living), Find_Not(Find_ID(CSTE)), Find_Owner(plr))) Enter(home, mat); // Den besten Clonks auswählen und vor die Tür SetCursor(plr, GetHiRank(plr)); SetCommand(GetCursor(plr), "Exit"); // Und auf den Gegner schauen SetDir(2-team, GetCursor(plr)); }
func Timer() { var pDead2, pNewTarget; if(!pTarget) { for(var pDead in FindObjects(Find_Action("Dead"), Find_Distance(100))) { if(GetPhase(pDead) < 4) if(PathFree(GetX(), GetY(), pDead->GetX(), pDead->GetY())) { pDead2 = pDead; break; } } pDead = pDead2; if(pDead) { for(pNewTarget in FindObjects(Find_OCF(OCF_Alive), Find_Distance(100), Find_Hostile(GetOwner(pDead)))) { if(PathFree(GetX(), GetY(), pNewTarget->GetX(), pNewTarget->GetY())) { iTimer = 0; pTarget = pNewTarget; } } } } if(pTarget) { iTimer++; if(iTimer%10 != 0) return; if(iTimer > 100) pTarget = 0; else if(!PathFree(GetX(), GetY(), pTarget->GetX(), pTarget->GetY()) && !pTarget->Contained()) pTarget = 0; if(!pTarget) return; Message("Töte niemanden an diesem heiligen Ort!", this); DrawLightning(GetX(),GetY(),pTarget->GetX(), pTarget->GetY()); Punch(pTarget, 5); } }
global func CyclopsFindTarget(fx) { // Consider hostile clonks, or all clonks if the AI does not have an owner. var hostile_criteria = Find_Hostile(fx.cyclops->GetOwner()); if (fx.cyclops->GetOwner() == NO_OWNER) hostile_criteria = Find_Not(Find_Owner(fx.cyclops->GetOwner())); for (var target in FindObjects(Find_InRect(fx.guard_range.x,fx.guard_range.y,fx.guard_range.wdt,fx.guard_range.hgt), Find_OCF(OCF_CrewMember), hostile_criteria, Find_NoContainer(), Sort_Random())) if (PathFree(fx.cyclops->GetX(),fx.cyclops->GetY(),target->GetX(),target->GetY())) return target; // Nothing found. return; }
func StartFloating() { RemoveTimer("Seed"); SetAction("Idle"); this.Collectible = 1; this.NutritionalValue = this.NutritionalValue_; for (var attachment in mesh_attachments) DetachMesh(attachment); for (var obj in FindObjects(Find_Container(this))) { obj->Exit(); obj->StartFloating(); } }
func Initialize() { // Always have some music Music("Frontend", 1); MusicLevel(30); // Create lens flare if (!ObjectCount(LENS)) CreateObject(LENS, 400, 100); // Fix vines (are not correctly saved in this Objects.txt) var pVine; for (pVine in FindObjects(Find_ID(VINE))) pVine->SetPosition(pVine->GetX(), pVine->GetY() - 35); // Create goal if (!ObjectCount(SCRG)) CreateObject(SCRG); // Evaluation dialog options SetNextMission("Tutorial.c4f\\Tutorial05.c4s", "$BtnRepeatRound$", "$BtnRepeatRoundDesc$"); }
func Activate() { SetComDir(COMD_Stop(),Contained()); CreateMenu(NANO,Contained(),0,0,0,0,1); AddMenuItem("Selbst Injekzieren","Inject",GetID(Contained()),Contained()); if(FindObject2(Find_Distance(15),Find_Exclude(Contained()),Find_OCF(OCF_Alive()))) { for(next in FindObjects(Find_Distance(15),Find_Exclude(Contained()),Find_OCF(OCF_Alive()))) { AddMenuItem(Format("%s von %s Injekzieren",GetName(next),GetPlayerName(GetOwner(next))),"OtherInject",GetID(next),Contained(),0,next,"Naniten Injekzieren"); } return(1); } return(1); }
func InitializePlayer(int plr) { // Players only if (GetPlayerType(plr)!=C4PT_User) return; // Scenario init if (!g_is_initialized) g_is_initialized = DoInit(plr); // Harsh zoom range for (var flag in [PLRZOOM_LimitMax, PLRZOOM_Direct]) SetPlayerZoomByViewRange(plr,400,250,flag); SetPlayerViewLock(plr, true); // Create per-player-counted tools if (g_max_player_num < GetPlayerCount(C4PT_User)) { ++g_max_player_num; for (var obj in FindObjects(Find_ID(Chest))) if (obj.tool_spawn) obj->CreateContents(obj.tool_spawn); }
private func CheckStuck() { var pClonk,iYChange,iX,iY; // Alle feststeckenden Clonks in der Nähe suchen for (pClonk in FindObjects(Find_InRect(-20,-20,40,40), Find_OCF(OCF_CrewMember),Find_NoContainer())) { iX=GetX(pClonk); iY=GetY(pClonk); while(Stuck(pClonk) && Inside(GetY(pClonk)-GetY(),-20,20)) { if(!(iYChange=BoundBy(GetY(pClonk)-GetY(),-1,1))) iYChange=1; // Zur Sicherheit... if(!Inside(GetY(pClonk)+iYChange,-100,LandscapeHeight())) break; SetPosition(GetX(pClonk),GetY(pClonk)+iYChange,pClonk); } // verschieben fehlgeschlagen: rückgängig machen if(Stuck(pClonk)) SetPosition(iX,iY,pClonk); } }
func DoInit(int first_player) { // Test //CreateObjectAbove(LiftTower, 178,405, first_player); // Set time of day to evening and create some clouds and celestials. Cloud->Place(15); EnsureObject(Rule_BuyAtFlagpole,0,0,-1); SetSkyAdjust(0xff000000); var storm = EnsureObject(Storm,0,0,NO_OWNER); storm->SetStorm(-20,0,1000); SetSkyParallax(1); // move background with the wind var time = EnsureObject(Time,0,0,-1); time->SetTime(600); time->SetCycleSpeed(20); // Goal CreateObject(Goal_Plane); // Plane part restore for (var part in FindObjects(Find_Func("IsPlanePart"))) part->AddRestoreMode(); return true; }
protected func CheckBorders() { // Prüfen ob ein Objekt gerade aus dem Spielfeld fliegt var mapwdt = LandscapeWidth(); var xdir, xoff, x; for (var obj in FindObjects(Find_Func("GetXDir"))) { xdir = GetXDir(obj)/10; xoff = obj->GetDefOffset(); if (xdir < 0) { // Linker Rand x = (GetX(obj)+xoff)+xdir; if (x <= 0) SetPosition(BoundBy(mapwdt+x-xoff, 0, mapwdt+xoff), GetY(obj)+GetYDir(obj)/10, obj, 1); } else { // Rechter Rand x = (GetX(obj)-xoff)+xdir-mapwdt; if (x >= 0) SetPosition(BoundBy(x+xoff, -xoff, mapwdt), GetY(obj)+GetYDir(obj)/10, obj, 1); } } return 1; }