[Gelöst] bestimme Funktion durch appendto löschen, wenn...

Kurz:
ich möchte durch ein appendto unter Anwedung einer if Bedingung eine bestimmte Funktion aus einem Skript löschen. Die Funktion soll nicht leer werden, sondern wirklich komplett gelöscht.

Lang:
Im Erweiterungspack gibt es einen Beutel, mit dem man die Clonks ausrüsten kann, sodass sie mehr Gegenstände tragen können, welche in den Beutel wandern. Man kann ihn auch auf "autocollecT" schalten, sodass automatisch alle eingesammelten Gegenstände in den Beutel getan werden.
Nun beißt sich das offensichtlich mit dem Hazardclonk, welcher ja mind. 2 Objekte gleichzeitig tragen kann. Dadurch funktioniert zumindest die Autocollect Funktion nicht mehr.
Ich habe bereits ausfindig gemacht, dass es an der "Collection2" Funktion im Hazardclonk skript liegt. Wenn ich die genannte Funktion komplett entferne, dann funktioniert autocollect auch bei hazardclonks. Da es dann aber zu anderen Problemen kommen kann, will ich diese Funktion in einem appendto sozusagen ein- und ausschalten. Ich habe dafür bereits eine globale Varibale definiert, welche auf 1 oder 0 gesetzt wird, je nach dem, ob autocollect an oder aus ist.
Das Problem ist nun, dass es offensichtlich nicht reicht, die Funktion "collection2" einfach leer zu lassen. Denn allein das vorhandensein dieser Funktion, auch wenn sie leer ist, sorgt dafür, dass AutoCollect nicht funktioniert.
Also wie löse ich das Problem? Wie kann ich eine if Bedingung schreiben, sodass, wenn sie erfüllt ist, die Fuinktion Collection2 komplett ausradiert wird?

> Die Funktion soll nicht leer werden, sondern wirklich komplett gelöscht.


Das geht nicht. Am tatsächlich Textinhalt eines Scripts kannst du per Scriptbefehl nichts ändern.

Wie funktioniert denn der Beutel? Definiert der selber Collection-Aufrufe für Clonks, die der Hazardclonk intern überlädt oder sowas?

Anbei das Skript vom Beutel. Die Variable “AutoCollectIstAn” kommt von mir, um sie im appendto als Bedingung zu verwenden.

Es gibt eigentlich nichts darin, was irgendwie im Konflikt mit etwas kommen könnte. Meine Theorie wäre jetzt, dass die Funktionen Collection bzw. Collection2 in der Engine oder sonstwo im Clonksystem definiert sind, wodurch sie wenn im Script vorhanden immer aufgerufen werden, wenn etwas eingesammelt wird, denn z.b auch im Hazardclonkscript wird Collection2 nirgends aktiv aufgerufen…  Und dass der Beutel nur dafür ausgelegt ist, mit Collection umzugehen, aber versagt, sobald Collection2 aufgerufen wird.

Edit:
http://www.clonk.de/docs/de/sdk/definition/script.html
Collection2   object obj   Wenn das Objekt ein anderes Objekt (obj) aufgenommen hat (immer, auch durch Scriptbefehl Enter)


#strict

local User;
static AutoCollectIstAn;

protected func Activate(pClonk)
{
  [$PutOn$]
  if(FindObject(GetID(),0,0,0,0,0,“Belongs”,pClonk))
    return(PlayerMessage(GetOwner(pClonk),"$AlreadyHasBag$",pClonk,GetName(pClonk)));
  SetAction(“Belongs”,pClonk);
  Sound(“Connect”,0,0,0,GetOwner(pClonk) +1);
  PlayerMessage(GetOwner(pClonk),"$BagPutOn$",pClonk);
  User= pClonk;
  return(1);
}

protected func AttachContextPouch(pActionTarget,pObj,iSelection)
{
  [$Bag$|Image=BETL]
  // SetComDir(COMD_Stop(),pActionTarget);
  BagMenu(0,pActionTarget);
  return(1);
}

private func BagMenu(idItem,pClonk)
{
  if(pClonk) User= pClonk;
  var obj,trg,idLast;
  var cnt= Contained(User);
  CreateMenu(GetID(),User,0,0,"$Bag$",0,1,1);
  AddMenuItem(Format("$Contents$ (%d)",ContentsCount()),“ShowContents”,BETL,User);
  while(obj= FindObject(0,0,0,0,0,0,0,0,User,obj)) 
   if(GetOCF(obj) & OCF_Collectible() || GetID(obj)== SWD1 || GetID(obj)== SWD2)
    if(GetID(obj)!= GetID())
     {
     if(idLast!= GetID(obj)) AddMenuItem("$Insert$",“Put”,GetID(obj),User,0,0,0,4,obj);
     idLast= GetID(obj);
     }
  if(cnt && Contents()) AddMenuItem("$UnpackBag$",“PutAll”,GetID(cnt),User,0,cnt,0,4,cnt);
  if(GetAction(User) eq “Push”)
   if(trg= GetActionTarget(0,User))
    if(GetOCF(trg) & OCF_Container())
     if(Contents())
      AddMenuItem("$UnpackBag$",“PutAll”,GetID(trg),User,0,trg,0,4,trg);
  if(ObjectCall(User,“IncludeClonk”))
   if(LocalN(“AutoCollect”,User))
    AddMenuItem("$AutoCollectOn$",“AutoCollect”,SY03,User);
   else
    AddMenuItem("$AutoCollectOff$",“AutoCollect”,MCMX,User);
  AddMenuItem("$Deposit$",“Loose”,BMSD,User);
}

private func ShowContents()
{
  CreateMenu(GetID(),User,0,0,"$BagIsEmpty$");
  var obj,idLast,iSMI;
  while(obj= FindObject(0,0,0,0,0,0,0,0,this(),obj))
    {
    if(idLast!= GetID(obj)) { AddMenuItem("$Get$",“Get”,GetID(obj),User,ContentsCount(GetID(obj)),iSMI,0,4,obj); iSMI++; }
    idLast= GetID(obj);
    }
}

private func Get(idObj,iSelection)
{
  var limit= GetDefCoreVal(“CollectionLimit”,“DefCore”,GetID(User));
  if(FindContents(idObj))
   if((ContentsCount(0,User)< limit) || (limit== 0))
    if(!ObjectCall(User,“RejectCollect”,idObj,FindContents(idObj)))
     {
     var Temp;
     if(LocalN(“AutoCollect”,User)) { LocalN(“AutoCollect”,User)= 0; Temp= 1; }
     Enter(User,FindContents(idObj));
     if(Temp) LocalN(“AutoCollect”,User)= 1;
     Sound(“Grab”);
     }
  ShowContents() && SelectMenuItem(iSelection,User);
}

puplic func Put(idObj)
{
  if(FindContents(idObj,User))
   if(ContentsCount()< GetDefCoreVal(“CollectionLimit”,“DefCore”,GetID()))
    {
    Enter(this(),FindContents(idObj,User));
    Sound(“Grab”);
    }
   else
    {
    PlayerMessage(GetOwner(User),"$BagIsFull$",User);
    }
  // Menü aktualisieren
  var iSelection;
  if(FindOtherContents(GetID(),User)) iSelection= GetMenuSelection(User);
  BagMenu() && SelectMenuItem(iSelection,User);
}

puplic func Put2(pObj)
{
  if(!(Contained(pObj)== User)) return();
  if(ContentsCount()< GetDefCoreVal(“CollectionLimit”,“DefCore”,GetID()))
    {
    Enter(this(),pObj);
    Sound(“Grab”);
    var iVal= 1;
    }
   else
    {
    iVal= 0;
    }
  if(ContentsCount()< GetDefCoreVal(“CollectionLimit”,“DefCore”,GetID()))
   PlayerMessage(GetOwner(User),"$Contents$: %d / %d",User,ContentsCount(),GetDefCoreVal(“CollectionLimit”,“DefCore”,GetID()));
    return(iVal);
  return(iVal);
}

private func PutAll(idContainer,pContainer)
{
  var limit= GetDefCoreVal(“CollectionLimit”,“DefCore”,idContainer);
  if(GetID(Contained(User))== idContainer)
    {
    while(Contents())
      {
      if(PutIt(Contents(),pContainer))
        Sound(“Grab”);
      else
        break;
      }
    }
  if(GetAction(User) eq “Push”)
   if(GetID(GetActionTarget(0,User))== idContainer)
    {
    while(Contents())
      {
      if(PutIt(Contents(),pContainer))
        Sound(“Grab”);
      else
        break;
      }
    }
  BagMenu();
}

private func PutIt(pObj,pContainer)
{
  var limit= GetDefCoreVal(“CollectionLimit”,“DefCore”,GetID(pContainer));
  if((ContentsCount(0,pContainer)>= limit) && (limit!= 0)) return(0);
  if(ObjectCall(pContainer,“RejectCollect”,GetID(pObj),pObj)) return(0);
  Enter(pContainer,Contents());
  return(1);
}

private func AutoCollect()
{
  Sound(“Click”);
  if(LocalN(“AutoCollect”,User))
   { LocalN(“AutoCollect”,User)= 0; AutoCollectIstAn= 0; }
  else
    {
    LocalN(“AutoCollect”,User)= 1; AutoCollectIstAn= 1;
    Put_All();
    }
  CloseMenu(User);
}

private func Put_All()
{
  var obj;
  if(!(obj= FindOtherContents(GetID(),User))) return();
  if(Put2(obj)) return(Put_All());
}

public func Loose(idItem,fNoMsg)
{
  if(!fNoMsg) PlayerMessage(GetOwner(GetActionTarget()),"$BagDeposited$",GetActionTarget());
  var pEnter= Contained(GetActionTarget());
  Sound(“Connect”,0,0,0,GetOwner(GetActionTarget()) +1);
  SetAction(“Idle”);
  SetActionTargets();
  if(pEnter) Enter(pEnter);
  CloseMenu(User);
}

protected func Hit()
{
  Sound(“WoodHit*”);
}

protected func RejectEntrance(pContainer)
{
  if(GetAction() eq “Belongs”) return(1);
}

/* Produkteigenschaften */

public func IsAnvilProduct() { return(1); }

Mir ist gerade aufgefallen, dass es für den Beutel noch ein Clonk appendto gibt, in dem unter anderem steht:
puplic func Collection2(pObj,a,b,c,d,e,f,g,h)
{
  BagCheck(pObj);
  return(_inherited(pObj,a,b,c,d,e,f,g,h));
}

puplic func BagCheck(pObj)
{
  if(!AutoCollect) return(0);
  var beutel;
  if(!(beutel= FindObject(BETL,0,0,0,0,0,"Belongs",this()))) return(0);
  if(LocalN("User",beutel)!= this()) return(0);
  if(GetID(pObj)!= BETL)
   if(!Contained())
    ObjectCall(beutel,"Put2",pObj);
   else
    ScheduleCall(beutel,"Put2",3,0,pObj);   
}


Eventuell muss man es hier irgendwie für den Hazardclonk anpassen…

Das Problem ist übrigens gelöst. Und zwar hatte der normale Clonk vor dem Beutel ja noch keine Collection2 Funktion. Deswegen wurde beim Hazardclonk dort kein inherited verwendet.  Nun da der normale Clonk aber durch den Beutel Collection2 hatte, wurde diese Funktion beim Hazardclonk überladen.

Es hat also gereicht einfach ein _inherited(); dazu zu schreiben und jetzt funktioniert alles wie es soll :slight_smile: