Aller au contenu

Photo

Script hilfe bitte.. was is da falsch? was sollte ich ändern?


  • Veuillez vous connecter pour répondre
12 réponses à ce sujet

#1
Shodushi

Shodushi
  • Members
  • 87 messages
hi, also ich habe meiner Creatur/NPC den Wert  PlotGiver=True gegeben, also in den Einstellungen der Creatur/NPC selbst. So, nachdem ich dann eine Quest erledigt habe, soll per script der wert dann auf FALSE gesetzt werden.
hier mal das script:

#include "events_h"
#include "plt_clear_the_windmill_2_g"
#include "wrappers_h"
#include "plot_h"

void main()
{
    event ev = GetCurrentEvent();
    int nEventType = GetEventType(ev);
    object  oBertha             =   GetObjectByTag("bertha_spider_quest_g");

      switch(nEventType)
    {
        case EVENT_TYPE_TEAM_DESTROYED:
         {

              if(GetEventInteger(ev,0) == 1)
              {
                   WR_SetPlotFlag(PLT_CLEAR_THE_WINDMILL_2_G, MONSTERS_SLAIN, TRUE);
              }

              break;

              SetPlotGiver(oBertha, FALSE);
              break;

          }
    }


      HandleEvent(ev, RESOURCE_SCRIPT_AREA_CORE);
}


Das script lässt sich einwandfrei compilieren, doch hat es leider keine Auswirkungen. Also die Quest wird zwar abgeschlossen wie sie soll, nur der Plotgiver wird leider nicht zurückgesetzt./bzw verschwindet das Symbol über dem NPC leider net :(

ich habe auch schon probiert das script mit folgenden Änderungen auszuführen..
object  oPC                   =  GetHero(oPC);
object  oBertha             =   UT_GetCreatureByTag(oPC,"bertha_spider_quest_g");
& weiter unten im script dann
SetPlotGiver(oPC, FALSE);  usw

was aber auch nichts gebracht hat... hat vieleicht jemand eine Idee??

Modifié par Shodushi, 22 janvier 2010 - 03:57 .


#2
cyberbyte

cyberbyte
  • Members
  • 346 messages
kann ja theoretisch auch gar nicht funktionieren da du kurz vor
SetPlotGiver(oBertha, FALSE);
ja mit
break;
abbrichst! somit
SetPlotGiver(oBertha, FALSE);
nie ausgeführt werden kann. Also das erste break da raus  dann solte das auch funzen

Modifié par cyberbyte, 22 janvier 2010 - 04:30 .


#3
Shodushi

Shodushi
  • Members
  • 87 messages
huch, das is mir ja noch garnicht aufgefallen :) danke , werds nachher daheim mal testen, erstmal viel dank für die doch schnelle antwort !

#4
DeepImpact

DeepImpact
  • Members
  • 520 messages
Kleiner Tipp:

Debugging mit

object oHero = GetHero();

DisplayFloatyMessage(oHero, "TATA!", FLOATY_MESSAGE, 16777215, 5.0);

#5
Shodushi

Shodushi
  • Members
  • 87 messages
@cyberbyte das mit dem brake wegmachen hat leider nichts gebracht :(



und hmm Deepimpact kannst du bitte etwas genauer sein, kann dir nicht ganz folgen.. :)

#6
cyberbyte

cyberbyte
  • Members
  • 346 messages
DeepImp. meint das du zum Testen deines Scriptes dir ein paar Textmeldungen einbauen sollst/kannst die die Teile dann an kritischen Script Funktionen Textmeldungen ausgeben was gerade wie wo gemacht wird. ....



kannst bitte mal dein Script so wie es jetzt bei dir aussieht posten.Das man sieht wo es klemmt. Kann keiner hier Hellsehen :)



lG Silk

#7
Shodushi

Shodushi
  • Members
  • 87 messages
muss ich morgen machen, bin gerade nicht daheim..

#8
Shodushi

Shodushi
  • Members
  • 87 messages
ich hab mein zu dem obigen script, noch 2 weitere gefertigt...



//start ###nr 1####

#include "events_h"

#include "plt_clear_the_windmill_2_g"

#include "wrappers_h"

#include "plot_h"



void main()

{

event ev = GetCurrentEvent();

int nEventType = GetEventType(ev);

object oBertha = GetObjectByTag("bertha_spider_quest_g");



switch(nEventType)

{

case EVENT_TYPE_TEAM_DESTROYED:

{



if(GetEventInteger(ev,0) == 1)

{

WR_SetPlotFlag(PLT_CLEAR_THE_WINDMILL_2_G, MONSTERS_SLAIN, TRUE);

}



break;

}

}

switch(nEventType)

{

case BERTHA_REWARDS_RECIEVED:

{

SetPlotGiver(oBertha, FALSE);

break;

}

}

HandleEvent(ev, RESOURCE_SCRIPT_AREA_CORE);

}



//end





und noch das 2.

//start ###2###

#include "events_h"

#include "plt_clear_the_windmill_2_g"

#include "wrappers_h"

#include "plot_h"



void main()



{

event eParms = GetCurrentEvent(); // Contains all input parameters

int nType = GetEventType(eParms); // GET or SET call

int nFlag = GetEventInteger(eParms, 1); // The bit flag # being affected

int nResult = FALSE; // used to return value for DEFINED GET events



string strPlot = GetEventString(eParms, 0); // Plot GUID



object oParty = GetEventCreator(eParms); // The owner of the plot table for this script

object oConversationOwner = GetEventObject(eParms, 0); // Owner on the conversation, if any

event ev = GetCurrentEvent();

int nEventType = GetEventType(ev);

object oPC = GetHero();

object oBertha = UT_GetNearestCreatureByTag(oPC,"bertha_spider_quest_g");



plot_GlobalPlotHandler(eParms); // any global plot operations, including debug info



if(nType == EVENT_TYPE_SET_PLOT) // actions -> normal flags only

{

int nValue = GetEventInteger(eParms, 2); // On SET call, the value about to be written (on a normal SET that should be '1', and on a 'clear' it should be '0')

int nOldValue = GetEventInteger(eParms, 3); // On SET call, the current flag value (can be either 1 or 0 regardless if it's a set or clear event)



// IMPORTANT: The flag value on a SET event is set only AFTER this script finishes running!





switch(nEventType)

{

case EVENT_TYPE_TEAM_DESTROYED:

{



if(GetEventInteger(ev,0) == 1)

{

WR_SetPlotFlag(PLT_CLEAR_THE_WINDMILL_2_G, MONSTERS_SLAIN, TRUE);

}



break;

}

switch(nFlag)

{

case BERTHA_REWARDS_RECIEVED:

{

SetPlotGiver(oBertha, FALSE);

break;



}

}

plot_OutputDefinedFlag(eParms, nResult);



HandleEvent(ev, RESOURCE_SCRIPT_AREA_CORE);

}} }

//end ###2###





aber leider wird auch bei beiden der plotgiver leider net auf false gesetzt.. an dem break davor kann es nicht liegen, denn selbst ohne klappt es nicht..

den floating text hab ich aber noch nicht angewandt, glatt vergessen...

#9
DeepImpact

DeepImpact
  • Members
  • 520 messages
Erst Mal ne Bitte! Immer QUOTE oder CODE verwenden.

Warum verwendest du im ersten Script zweimal den Switch(nEventType)
Das ist doch redundant.

//start ###nr 1####

#include "events_h"
#include "plt_clear_the_windmill_2_g"
#include "wrappers_h"
#include "plot_h"

void main()
{
    event ev = GetCurrentEvent();
    int nEventType = GetEventType(ev);
    object oBertha = GetObjectByTag("bertha_spider_quest_g");

    switch(nEventType)
    {
    case EVENT_TYPE_TEAM_DESTROYED:
        {
            if(GetEventInteger(ev,0) == 1)
                {
                WR_SetPlotFlag(PLT_CLEAR_THE_WINDMILL_2_G, MONSTERS_SLAIN, TRUE);
                }
            break;
        }
    case BERTHA_REWARDS_RECIEVED:
        {
        SetPlotGiver(oBertha, FALSE);
        break;
        }
    }
    HandleEvent(ev, RESOURCE_SCRIPT_AREA_CORE);
}
//end


Was soll denn die Zeile
            if(GetEventInteger(ev,0) == 1)
machen?

Nach etwas was mir auffällt, aber kann auch richtig sein:
1) Ich schreibe immer "switch( nEventType )" (mir Spaces)
2) Heisst der Plot_Giver wirklich "bertha_spider_quest_g" und nicht etwas "bertha" und das ist der Name des Plots?

Bertha klingt so nach nem Namen :)

Modifié par DeepImpact, 25 janvier 2010 - 03:11 .


#10
cyberbyte

cyberbyte
  • Members
  • 346 messages
so auf den ersten blick auch schlecht gelöst
-> object oParty = GetEventCreator(eParms); //

Da DA derzeit nur als Singelplayer Spiel geplant ist das eine Unnötige Fehler Quelle.
Die Party gehört demnach immer zum Player und ist somit eindeutig zuweisbar.
-> object oParty = GetParty( oPC );
ich schau es mir gleich mal genauer an aber hier scheinen einige Verschachtelte Anweisung.... falsch zu liegen... schreib am besten viele Kommentare dazu was du in einem Script bezweckst. Das erleichtert dir und anderen schneller einen Überblick.


edit: alsooo da liegt einiges schief... werde das mal komplet für dich neu schreiben.
das ganze ist ein Area script ja `!  du machst zB den Fehler schon ganz am Anfang in dem du den Event der gefeuert wird wenn jemand stirbt... in ein if Bedingung schreibt die nur gültig ist wenn gerade ein plot gesetzt wurde Ein Event ist ein kurzes signal das so zusagen "HALLO hier ist gerade das passiert!" ruft also kein Dauer zustand. Wenn du also einen event in einen anderen verbirgst kann dieser nie abgefragt werden wenn nicht der andere Zeitgleich gefeuert wird! auf die selbe Nanosekunde!
Also nie Events verschachteln... 


hier ist es hilfreich wenn du beim Sript schreiben Abhängigkeiten versetzt darstellst.. das verschft dir Überblick... über die einzelnen Segmente...


if(nType == EVENT_TYPE_SET_PLOT) 
 {
     switch(nEventType)
      {


so hättest du leicht gesehen das das nicht funktionieren kann

na ja die Darstellungs Möglichkeiten des BBCode hier im Forum sind naja..... kaum hilfreich^^

zweiter großer Fehler den du oft begehst du verwendest für ein und das selbe verschiedene Namen! Definierst Variablen doppelt usw
Im obrigen Beispiel von dir nTyp und nEventType so geht es das ganze Script durch nTyp ist über GetEventType definiert nEventType auch... typicher Copy&Paste Coder Stile :)

Modifié par cyberbyte, 25 janvier 2010 - 07:39 .


#11
mr.frost72

mr.frost72
  • Members
  • 313 messages
ich brauche auch mal hilfe Posted Image

nach erfüllung der quest, sollte im conv.dlg folgendes script den gegenstand aus dem player inv. ablegen ..

geht aber nicht !!!! Posted Image


#include "utility_h"
void main()
    {
         object oHero = GetHero();

        UT_RemoveItemFromInventory(R"item_quest_apsel.uti", 1, oHero);

        }



#12
cyberbyte

cyberbyte
  • Members
  • 346 messages
hast evtl nen Schreibfehler bei der ResRef des Items ?  Item hat keine Kennzeichnug (TAG)?

kannst auch mit RemoveItemsByTag(oPlayer,"KenzeichnungdesItems",NumToRemove); testen


am besten bei unklarheiten Debug Meldungen für dich reinschreiben. die du nach test auch wider raus machenkannst.   

z.B.  
#include "utility_h"
void main()
    {
     object oHero   = GetHero();  
     string sItem   = "MeinItemTag";
     int NumToRemove = 1; 
     
     int nitem = CountItemsByTag(oHero, sItem);   
     
      if(nitem < NumToRemove)
      {   
        // hilfsmeldung
        DisplayFloatyMessage(oHero,
            "Debug: nicht ausreichend " + sItem +
            " im Inventar von " + GetName(oHero) + 
            " gefunden!!",FLOATY_MESSAGE,0xff0000,5.0);        
      }
      else
      {                    
         RemoveItemsByTag(oHero,sItem,NumToRemove);
         // hilfsmeldung
        DisplayFloatyMessage(oHero,
            "Debug: "+IntToString(NumToRemove)+" " + sItem +
            " aus Inventar von " + GetName(oHero) + 
            " entfernt!",FLOATY_MESSAGE,0x00ff00,5.0);              
      }
  
     // UT_RemoveItemFromInventory(R"item_quest_apsel.uti", 1, oHero); 

     }

hab es auch im Workshop noch mal erklärt .....
Hilfe - Remove Item From Inventory

Modifié par cyberbyte, 25 janvier 2010 - 11:33 .


#13
Shodushi

Shodushi
  • Members
  • 87 messages
@ deepimpact

Was soll denn die Zeile
if(GetEventInteger(ev,0) == 1)
machen?

naja, das hatte ich von einem scrip von SilentCid, was das genau bezweckt ist mir selbst nicht klar :)


2) Heisst der Plot_Giver wirklich "bertha_spider_quest_g" und nicht etwas "bertha" und das ist der Name des Plots?

Bertha klingt so nach nem Namen :)

ja der heisst wirklich so :) das stammt noch aus meinen anfängen bevor ich das toolset geupdated habe, und war irgenwie zu faul den mal zu ändern :)


Modifié par Shodushi, 27 janvier 2010 - 03:17 .