World of Gothic Archiv
> NWN-Hilfe kann man bestimmen, das man einen gegenstand nur einmal im inventar haben darf? |
|
20.07.2002, 15:22 | #1 | ||
valarion Beiträge: 17 |
kann man bestimmen, das man einen gegenstand nur einmal im inventar haben darf?
hallo! ich habe eine frage bezüglich einiger gegenstände. und zwar soll der spieler ein paar säcke schleppen die sehr schwer sind, deswegen soll er davon maximal einen auf einmal schleppen können. nun weiss ich nicht wie ich die abfrage machen muss das er wenn er den gegenstand schon im inventar hat das er nich noch einen zweiten aufnehmen kann und dann eine meldung bekommt von wegen: das ist nun wirklich zu schwer, oder so in der art. weiss zufällig jemand ob und wenn ja wie es funktioniert? |
||
20.07.2002, 15:33 | #2 | ||
Gawain15 Beiträge: 1.084 |
Ich weiß nicht ob das funzt... Criz, Xerxes: Erstmal OnAcquireItem wenn der Spieler einen Sack aufnimmt ne Variable auf 1 setzen, bei UnAcquireItem wieder auf 0 setzen wenn der Spieler den Sack ablegt is kein Prob, aber wie verhindern das der Spieler einen 2. Sack aufnimmt? Clearallactions Speakstring? Aber das geht net bei Clearallaction tritt es ja erst in Kraft wenn der Sack schon aufgenommen wurde... vielleicht mir OnClick? Ihr dürft mal rumprobieren ich geh jetzt schlafen 8) Wenn dir bis morgen früh keiner geholfen hat probiere ich meinen Vorschlag mal aus. |
||
20.07.2002, 15:49 | #3 | ||
valarion Beiträge: 17 |
danke für die schnelle antwort, das ist auf jedenfall schonmal ein ansatz mit dem ich rumprobieren kann. :) hab auch gleich noch ne 2. frage: geht es das ich bei onacquireitem auch ne abfrage machen kann die erst dann true ist wenn er den gegenstand mindestens 6 mal zb aufgenommen hat? das brauch ich fürs äpfel pflücken *g* |
||
20.07.2002, 16:08 | #4 | ||
Gawain15 Beiträge: 1.084 |
Ich hab das noch nicht getestet und aus dem Kopf aufgeschrieben (also sind nicht alle Befehle 1a... aber du kriegst das schon hin) void main() { object oPC; object oItem; int nApfel = nApfel + 1; oItem = GetModuleItemAcquired(); if (GetLocalInt(oPC, "Aepfel") != 6) { if (GetIsObjectValid(oItem) == TRUE) {if (GetTag(oItem) == "Apfel") {oPC = GetItemPossessor(oItem); SetLocalInt(oPC, "Aepfel", nApfel); } } } if (GetLocalInt(oPC, "Aepfel") == 6) { //Das passiert wenn der spieler 6 pfel aufgesammelt hat } } So nu geh ich aber schlafen... /e: shcon gleich nen Fehler entdeckt :) |
||
20.07.2002, 17:27 | #5 | ||
valarion Beiträge: 17 |
hm funzt leider immer noch nicht hab auch schon n bissl mit rumgespielt aber er führt den tagebucheintrag nicht aus |
||
20.07.2002, 18:46 | #6 | ||
valarion Beiträge: 17 |
hm soweit ich das bisher rausgefunden habe müsste der fehler beim increment liegen, damit scheint er irgenwie nicht klarzukommen. wenn ich die abfrage so setze das der eintrag erfolgt wenn er nur einen apfel aufnimmt funzt des wunderbar... nur wenn ich es wieder auf mehr als einen apfel setze will er nicht mehr |
||
20.07.2002, 21:08 | #7 | ||
valarion Beiträge: 17 |
ich habs unglaublicherweise tatsächlich geschafft das problem zu lösen :) ich hab ka ob des ne gute lösung ist aber es funktioniert. für den fall das jemand interesse an dem script hat, oder ein ähnliches problem mit dem zählen von items aus dem inventory, post ich das script einfach mal: wird eingefügt unter OnAcquireItem des moduls: { object oPC; object oItem; object oApfel; object oApfelchecker; int iApfelcounter; oItem = GetModuleItemAcquired(); oPC = GetItemPossessor(oItem); oApfelchecker = GetFirstItemInInventory(oPC); if (GetIsObjectValid(oItem) == TRUE) { if (GetTag(oItem) == "Apfel") { while(GetIsObjectValid(oApfelchecker) == TRUE ) { if (GetTag(oApfelchecker) == "Apfel") { iApfelcounter++ ; SetLocalInt(oPC, "apfel_counter", iApfelcounter); } oApfelchecker = GetNextItemInInventory(oPC); } if(GetLocalInt(oPC, "apfel_counter") == 6) { AddJournalQuestEntry("apfelflinsen", 5, oPC); } } } } jedes mal wenn jetzt also das entsprechende item, in diesem fall ein apfel, aufgenommen wird, durchsucht er da ganze inventar nach äpfeln. wenn er die vorgegebene anzahl äpfel im inventory findet, dann trägt er das im questlog ein... das kann natürlich an alles mögliche andere angepasst werden... achso, was ich noch gefunden habe und was mir beim fertigstellen des scriptes sehr geholfen hat: wenn man mit komplexeren scripten probleme hat kann man an bestimmten stellen wo man zb abfragen etc drin hat einfach folgendes eintragen: FloatingTextStringOnCreature("Debug: Die erste Bedingung ist wahr!", oPC); wobei man mit oPC natürlich den PC definieren sollte. es wird dann der string über dem kopf des PC ausgegeben wenn die bedingung innerhalb der es verwendet wurde wahr ist. so hat man eine art debugersatz. ich denke viele der geübteren scripter hier im forum kennen das schon, aber da ich den hinweis hier im forum noch nicht gesehen habe dachte ich mir erwähne ich es einfach nochmal für die die es nicht wissen. allerdings bin ich immernoch auf der suche für mein erstes problem mit den säcken. hat da einer nen tip? :) |
||
21.07.2002, 04:33 | #8 | ||
Gawain15 Beiträge: 1.084 |
Nenn den Sack einfach oSack oder so. Dann setz sobald der Spieler einen Sack aufgenommen hat ne Variable auf 1. Check bei OnClick on des Sackes ob die Variable eins is beim If machste dann das: AssignCommand(oPC,ClearAllActions()); AssignCommand(oPC, SpeakString("2 Saecke sind zu schwer")); So dann kann er keinen 2. aufnehmen, du mußt die Variable aber wieder auf 0 setzen damit Aurora weiß das der Spieler keinen Sack mehr hat das machste bei UnAquireItem dann wenn das Item == oSack SetLocalInt wieder auf 0 |
||
21.07.2002, 09:44 | #9 | ||
valarion Beiträge: 17 |
das klingt soweit einleuchtend nur weiss ich nicht was du mit onclick meinst, ich find dazu keinen event wo ich das eintragen könnte |
||
21.07.2002, 09:59 | #10 | ||
Gawain15 Beiträge: 1.084 |
Ich hatte da was durcheinander gebracht :) Das ganze natürlcih auch im OnAcquireItem reinhauen. |
||
21.07.2002, 11:33 | #11 | ||
valarion Beiträge: 17 |
ah wunderbar, danke, werde ich gleich mal testen :) |
||
21.07.2002, 13:31 | #12 | ||
valarion Beiträge: 17 |
hm funktioniert immer noch net wirklich... kanns aber auch eigentlich nicht, weil bei onacquireitem springt das script ja erst an wenn ich das item schon aufgenommen habe, dann ist es ja schon zu spät zu sagen das er es nich aufnehmen darf, oder versteh ich das falsch? |
||
21.07.2002, 14:04 | #13 | ||
valarion Beiträge: 17 |
also ich hab das script jetzt mal abgeändert... so das er wenn er einen 2. sack aufnehmen möchte, das er den dann wieder ablegt... das sieht nun so aus: object oPC; object oItem; oItem = GetModuleItemAcquired(); oPC = GetItemPossessor(oItem); if (GetLocalInt(oPC, "kornsack_check") == 1) { AssignCommand(oPC,ClearAllActions()); AssignCommand(oPC, SpeakString("Uff, zwei Saecke sind mir einfach zu schwer!")); ActionPutDownItem(oItem); } else { if (GetIsObjectValid(oItem) == TRUE) { if (GetTag(oItem) == "kornsack") { SetLocalInt(oPC, "kornsack_check", 1); } } } das funktioniert so weit, das man den ersten sack problemlos aufnehmen kann... wenn er den 2. sack aufnehmen will, dann sagt er auch das ihm das zu schwer ist, aber er legt den sack nicht wieder ab... kann es sein das actionputdownitem() nicht richtig funktioniert wenn man mehrere items mit dem selben tag im inventory hat? |
||
21.07.2002, 15:34 | #14 | ||
valarion Beiträge: 17 |
haha hat sich erledigt, ich hab nur das AssignCommand() vor ActionPutDownItem() vergessen. :) |
||
|