Eke Reloaded / Kill Captain Rule Problem

Ich hab ein Szenerio in dem ich das Eke reloaded Pack Addon, Ziel = Melee und die Regel Kill Captain aktiviert habe.

Sobald ich aber nun Stippel spawne per createobject(). Tritt "Stippel" als Spieler bei und wird sofort wieder eleminert , was dazu führt das die Stippel niemanden mehr angreifen.

Meine Idee war den spielerbeitritt der stippel als Spieler zu verhindern , damit sie nicht von der Kill captain rule gelöscht werden . ( EkeVerifyEvilOwner();  hatte ich gelöscht) … klappt auch jedoch greifen sie dann wieder nicht an…

Woran liegt es wenn der Stippel Spieler eliminiert ist  die monster nicht mehr angreifen ? Bzw wie kann ich das fixen ?

AUSZUG aus Stippel monster ( Cuspel )
__________________________________

func Initialize()
{
  // Farbe variiert leicht
  SetClrModulation(HSL(20, Random(255), 200 + Random(55)));

  SetAction("Walk");
  AddEffect("LifeCycle", this, 1, 10 + Random(40), this);     // hier wird ein effekt hinzugefügt

  // Enstehung dem Spiel(ziel) berichten
  GameCallEx("ReportCreation", this);

  stippelCount++;
}

func FxLifeCycleTimer(target, effectNumber, effectTime)
{
  EkeVerifyEvilOwner();   // ruft globale function auf die Stippel zu spieler macht ( glaube ich )

  if (OnFire())
  {
    var hsl = RGB2HSL(GetClrModulation());

    var h = (hsl >> 16) & 255;
    var s = (hsl >> 8) & 255;

    SetClrModulation(HSL(h, s, GetEnergy() * 10));
  }
  PhysicalVariation();    ///
  Pregnancy();
  Movement();
  Attack();
}

/// SCRIPT AUS SYSTEM ordner --> (Aufruf globale funktion) Set owner
___________________________________________________________
/* Stuff */

#strict

static const ekeVersion = 17;
static theEvil;

global func EkeVerifyEvilOwner()
{
  if (!theEvil) theEvil = FindObject(TE5B);
  if (!theEvil) theEvil = CreateObject(TE5B);

  var theEvilOwner = GetOwner(theEvil);

  if (GetOwner() != theEvilOwner) SetOwner(theEvilOwner);
  if (GetController() != theEvilOwner) SetController(theEvilOwner);

  // SetOwner() sollte laut Doku auch den Controller setzen, tut es aber nicht
}

global func EkeFindVictim(x, y, w, h, exclude)
{
  for (var victim in FindObjects(Find_InRect(x, y, w, h),
                                 Find_NoContainer(),
                                 Find_Exclude(exclude)))
  {
    var b0 = !ObjectCount(NF5B);
    var b1 = Hostile(GetController(), GetController(victim), 1);
    var b2 = GetOCF(victim) & OCF_Alive();
    var b3 = GetOCF(victim) & OCF_Container();
    var b4 = GetOCF(victim) & OCF_Grab();
    var b5 = GetOCF(victim) & OCF_Inflammable();
   
    if ((b0 || b1) && (b2 || b3 || b4 || (b1 && b5))) return(true);
  }
  return(false);
}

Wäre der Ansatz KillTheCaptain so zu erweitern, dass es Stippel-Spieler Ignoriert nicht leichter und viel eher das, was du möchtest?

Dass Stippel ein Spieler haben ist durchaus sehr sinnvoll! Das könnte dir anderenfalls irgendwo anders wieder Probleme machen.

Daran habe ich auch schon gedacht … Problem nur das ich nicht weis wie ;( … 

Ein paar zeilen löschen / minmal ändern / bzw copy paste krieg ich noch hin :wink:

/– KillTheCaptain –/

#strict

private func Execute()
{
  // Alle Spieler überprüfen
  var iPlrCnt, iPlr = 0;
  for (iPlrCnt = GetPlayerCount(); iPlrCnt; iPlr++)

if (GetPlayerName(iPlr) if (!GetPlayerName(Stippel))  // bzw  ? // Hier könnte sowas in der art eingefügt werden ? … aber bekomme syntax error  by: Execute() (obj Verlust Captain Ausnahme Stippel #18                                
      {                       
      iPlrCnt–;
      if (GetPlayerTeam(iPlr) != -1) if (!GetCaptain(iPlr))   // oder hier ?
        EliminatePlayer(iPlr); 
      }

}

Eher so:
private func Execute()
{
  // Alle Spieler überprüfen
  var iPlrCnt, iPlr = 0;
  for (iPlrCnt = GetPlayerCount(); iPlrCnt; iPlr++)

  if (GetPlayerName(iPlr) && GetPlayerName(iPlr) != "Stippel")
      {                      
      iPlrCnt–;
      if (GetPlayerTeam(iPlr) != -1 && !GetCaptain(iPlr))   // oder hier ?
        EliminatePlayer(iPlr);
      }

}


Noch ein bisschen mehr drauf achten wie man if( Condition && Condition) verbindet und was für Werte dir die Funktion übergeben :slight_smile:

Mhh jetzt geht die runde einfach sofort zuende ( weil mein spieler sofort wieder eleminiert wird) … ich hab mal mit getplayername() auf dem stippel monster getestet … da ich die stippel beschwöre wird nicht "Stippel" zurückgegben sondern mein eingener name"Medy"

GetOwner() und Getcontroller() geben mir jeweils nur 1 zurück und nicht "Stippel"… Obwohl in er globalen function ja eignetlich gesagt wird : SetOwner(theEvilOwner);

>[...] ich hab mal mit getplayername() auf dem stippel monster getestet ... da ich die stippel beschwöre wird nicht "Stippel" zurückgegben sondern mein eingener name"Medy"


Wenn man die Funktion "GetPlayerName" direkt auf ein Objekt ausführt, so wird nicht der Name des Objektes, sondern der Name von iPlayer zurückgegeben, was in diesem Fall der erste Parameter von "GetPlayerName" ist:
  string GetPlayerName(int iPlayer)
Weil du im Parameter nichts eingetragen hast, wurde hier die 0 eingetragen. Dies ist die Nummer des ersten Spielers, welcher wiederum dein Spieler ist ("Medy").

>GetOwner() und Getcontroller() geben mir jeweils nur 1 zurück und nicht "Stippel" [...]


Diese Funktionen geben den Besitzer ("GetOwner") oder den kontrollierenden Spieler ("GetController") des Objektes pObj zurück:
  int GetOwner(object pObj);
  int GetController(object pObj);

Der Besitzer des Stippels ist der Spieler "Stippel", welcher nach deinem Spieler erstellt worden ist und daher die nachfolgende Nummer deiner Spielernummer trägt, was in diesem Fall die 1 ist. Wenn du davon noch den Namen erhalten möchtest, so solltest du eher GetPlayerName(GetOwner()) verwenden, dann erhälst du auch den Namen "Stippel".

Zum Script:
Wenn du möchtest, dass die Stippel von der Regel "Verlust Captain" ignoriert werden, dann könntest du folgenden Script verwenden:

private func Execute()
{
  // Alle Spieler überprüfen
  var iPlrCnt, iPlr = 0;
  for (iPlrCnt = GetPlayerCount(C4PT_User); iPlrCnt; iPlr++)
    if (GetPlayerName(iPlr) && GetPlayerType(iPlr) == C4PT_User)
      {
      iPlrCnt--;
      if (GetPlayerTeam(iPlr) != -1) if (!GetCaptain(iPlr))
        EliminatePlayer(iPlr); 
      }
}


Hier werden einmal nur die vom Benutzer gesteuerten Spieler gezählt ("GetPlayerCount(C4PT_User)") bzw. anschließend auch nur sie überprüft ("GetPlayerType(iPlr) == C4PT_User").

Um den Script zu verwirklichen könntest du dir den hier als Anhang hinzugefügten Script nehmen und ihn in einen "System.c4g"-Ordner hineinlegen, welcher sich dort entweder bereits befinden sollte oder du erstellen kannst, indem du in dein Szenario einfach ein Verzeichnis erstellst und als "System.c4g" benennst. Dadurch wird der Script von der Spielregel "Verlust Captain" modifiziert und der Fehler sollte nicht mehr eintreten.

das funktioniert nur halbwegs … jedoch beendet sich die runde jetzt nicht mehr ( es ist das selbe als wenn ich die regel kill captain gar nicht erst benutze ) … erst wenn beide spieler tot sind geht die rudne zuende … es soll aber zuende gehen sobald nur noch 1 spieler am leben ist …  melee ist aktiviert …  wenn ich bei spielziel melee gucke steht auch noch es ist 1 gegner im spiel ( owohl alle ausser stippel tot sind ) …