Frage zu den PlayerFlags

Hier könnt ihr Unterstützung holen für euere Script Probleme, und Fragen rund um das Scripten.
Nachricht
Autor
thehappy

Frage zu den PlayerFlags

#1 Beitrag von thehappy » 17 Mär 2007 18:27

hallo ...

ich baue zur zeit queste in unseren shard ein und definiere den status der queste über die playerflags. das ganze sieht dann so aus:
public enum PlayerFlag // First 16 bits are reserved for default-distro use, start custom flags at 0x00010000
{
None = 0x00000000,
Glassblowing = 0x00000001,
Masonry = 0x00000002,
SandMining = 0x00000004,
StoneMining = 0x00000008,
ToggleMiningStone = 0x00000010,
KarmaLocked = 0x00000020,
AutoRenewInsurance = 0x00000040,
UseOwnFilter = 0x00000080,
PublicMyRunUO = 0x00000100,
PagingSquelched = 0x00000200,
Young = 0x00000400,
FinishedQuest001 = 0x00010000
so kann ich dann auch für andere quests entscheiden, ob eine vorherige quest nötig ist um diese zu machen.

nun meine frage:
kann ich mit den flags bei 0x00010001 weitermachen oder gilt das das prinzip der verdopplung, also 10002, 10004, 10008, usw ... ?
und wenn ich es eventuell falsch mache, was würde dann passieren?

dankeschön

nazghul

#2 Beitrag von nazghul » 17 Mär 2007 18:40

simple binaeraritmetik

0x10001 sind zwei flags - nämlich 0x10000 und 0x00001

Wenn Dein erstes Flag des Wert 0x10000 hat, hat das zweite 0x20000, dann 0x40000, 0x80000,0x100000 usw.

thehappy

#3 Beitrag von thehappy » 17 Mär 2007 19:03

würde das implizieren, daß nur 5 flags als custom flags zur verfügung stehen?

--> start custom flags at 0x00010000

irgendwie verwirrt mich das ein wenig :)
und entschuldigt, ich scripte noch nicht lange. bin schon stolz auf meine erste selbstgemachte quest ^^

Irian
Gold Mitglied
Beiträge: 620
Registriert: 08 Apr 2004 14:28
Wohnort: Regensburg
Kontaktdaten:

#4 Beitrag von Irian » 17 Mär 2007 19:11

Ich würde für sowas kein Flag hernehmen, ganz ehrlich. Das sind Flags für ganz spezielle Sachen, das für Quests zu verschwenden halte ich für nicht sinnvoll.

Ein enum sollte eigentlich ne 32 Bit Zahl sein, die ersten 16 Bits sind für distro reserviert, folglich bleiben noch ziemlich genau 16 (*g*) für eigene Anwendungen.

thehappy

#5 Beitrag von thehappy » 17 Mär 2007 21:03

gut, dann frag ich einfach mal ganz dumm:
wie könnte ich definieren ob die quest gemacht wurde oder nicht?
der wichtige teil des scriptes "Arthur der Bettler" sieht zur zeit so aus:
public override void OnTalk( PlayerMobile player, bool contextMenu )
{

PlayerMobile pm = player as PlayerMobile;
Direction = GetDirectionTo( player );

if ( pm.FinishedQuest001 == false )
{
player.SendGump (new DETArthurGump());
}
else
{
this.Say( "Gruesse Euch!" );
}
}

public override bool OnDragDrop( Mobile from, Item dropped )
{
PlayerMobile pm = from as PlayerMobile;
this.Direction = GetDirectionTo( from );

if ( dropped is Apple && pm.FinishedQuest001 == false)
{
this.Say( "Ich danke Euch, Fremder. Nehmt als Dank diesen Ring." );
from.AddToBackpack( new DETArthurRing() );
pm.FinishedQuest001 = true;
}
return true;
}

Irian
Gold Mitglied
Beiträge: 620
Registriert: 08 Apr 2004 14:28
Wohnort: Regensburg
Kontaktdaten:

#6 Beitrag von Irian » 17 Mär 2007 22:25

Es gibt schon ein Questsystem. Das definiert unter anderem im PlayerMobile public List<QuestRestartInfo> DoneQuests... Schau dir das mal an.

Ansonsten füg doch einfach ins PlayerMobile ne List<Quest> ein, die du dann serialisierst. Relativ simpel.

thehappy

#7 Beitrag von thehappy » 18 Mär 2007 14:51

hallo ...

nun, ich hab nun wirklich so jeden beitrag gelesen der zum thema passt, sowohl hier als auch im run-uo.de und runuo forum.
leider komme ich partout nicht weiter, was nicht mal an der serialisation zu liegen scheint.
falls es jemanden gibt der eine halbe stunde teamspeak/icq aufbringen könnte mir da ein wenig zur hand zu gehen dem wäre ich wirklich sehr dankbar. glaube zwar nicht, daß das jemand macht, aber fragen kostet bekanntlicherweise nichts :)

gruss, thehappy

Irian
Gold Mitglied
Beiträge: 620
Registriert: 08 Apr 2004 14:28
Wohnort: Regensburg
Kontaktdaten:

#8 Beitrag von Irian » 18 Mär 2007 15:11

Warum schreibst du nicht hier, wo du nicht weiterkommst?

thehappy

#9 Beitrag von thehappy » 18 Mär 2007 15:23

auf den punkt gebracht:
das standard quest system überfordert mich total!

ich suche daher eine möglichkeit dem player für jede quest eine variable zu geben im stil von "FinishedQuest10001 = false" die dann beim beenden auf "true" gesetzt wird.
das mit den playerflags hat sich ja schon im kern zerschlagen, daher suche ich eine andere möglichkeit die genauso praktisch ist und nebenbei auchnoch funktioniert!

ich kann nicht erklären wo ich technisch nicht weiterkomme da ich eigentlich nur ständig verschiedene sachen versuche. einerseits versuche ich die flag in das questscript selber einzubauen, komplett ohne erfolg.

da ich auch in ferner zukunft ohne persönlichen support keinen schritt weiterkomme würde ich empfehlen das thema so stehenzulassen. danke trotzdem für eure hilfe, immerhin hab ich das mit den playerflags schonmal verstanden :)

wenn ihr trotzdem sehen wollt ob sich was tut könnt ihr mich gerne mal auf www.uo-detention.de besuchen kommen, da gibts immer wieder neuigkeiten und hinweise auf das alpha release. weltenbau ist schliesslich zu 90% abgeschlossen.

danke für die hilfe :)

Irian
Gold Mitglied
Beiträge: 620
Registriert: 08 Apr 2004 14:28
Wohnort: Regensburg
Kontaktdaten:

#10 Beitrag von Irian » 18 Mär 2007 15:26

Im PlayerMobile halt...

bool[] doneQuests = new bool[MAX_QUESTS];

...natürlich mußt du dann, wenn du neue Quests codest, die MAX_QUESTS erhöhen. Beim Beenden einer Quest machst du dann...

doneQuests[questnumber] = true;

und im Serialize halt...

writer.Write((int)doneQuests.length);
for (int i=0; i<doneQuests.length; i++)
writer.Write((bool)doneQuest);

(Standard-Serialisierung von Listen) Und beim Deserialize...

int quests = reader.ReadInt();
for (int i=0; i<quests; i++)
doneQuests = reader.ReadBool();

...zumindest so in etwa irgendwie, sind sicher irgendwelche Fehler drin, aber technisch wäre das so denkbar. Ist halt sehr primitiv im Vergleich zum echten System.

thehappy

#11 Beitrag von thehappy » 18 Mär 2007 16:29

habs nochmal anders von vorne versucht, soweit alles in ordnung. nur beim de/serialisieren scheints nicht zu wollen:

code in der playermobile ist folgender:
private bool m_FinishedQuest20001;
[CommandProperty( AccessLevel.GameMaster )]
public bool FinishedQuest20001
{
get{ return m_FinishedQuest20001; }
set{ m_FinishedQuest20001 = value; }
}
und in der quest:
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
writer.Write( (bool)FinishedQuest20001 );
}

public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
FinishedQuest20001 = reader.ReadBool();
}
fehler ist folgender:


FinishedQuest20001 does not exist in the class or namespace 'Server.Mobiles.Quest20001'
da hörts jetzt wieder auf ...

Irian
Gold Mitglied
Beiträge: 620
Registriert: 08 Apr 2004 14:28
Wohnort: Regensburg
Kontaktdaten:

#12 Beitrag von Irian » 18 Mär 2007 16:34

Wenn du etwas IM PlayerMobile speicherst, wieso serialisierst du dann in der Quest? Natürlich gibt es eine Variable, die du IM PlayerMobile definierst, nicht automatisch in der Quest, ist doch logisch...

Serialisiere im PlayerMobile.

thehappy

#13 Beitrag von thehappy » 18 Mär 2007 16:57

puh, ein harter weg des lernens :D
hab mir durch einen kleinen fehler zwar erstmal den home-test-server zerschossen, lag aber bloß an der reihenfolge der deserialisierung!
hab den fehler behoben, das ganze auf den root übertragen und siehe da ... es funktioniert!
und was noch besser ist, ich hab's verstanden :D

danke euch sehr, und entschuldigt meine fragerei. bin ja noch ziemlich am anfang :)

Sotho Tal Ker

#14 Beitrag von Sotho Tal Ker » 18 Mär 2007 18:40

Fehler beim Speichern/Laden sind halt nur die schlimmsten Fehler. :)

thehappy

#15 Beitrag von thehappy » 22 Mär 2007 17:12

hallo :)

so langsam steigt die anzahl der queste die ich schreibe, daher kommt zur zeit ein kleines problem auf. da ich den status der einzelnen queste im playermobile festhalte wird das bei den props mit der zeit ein wenig voll! daher dachte ich muss es doch eine möglichkeit geben das ganze in eine art "unterordner" zu packen.

zur verdeutlichung ein screenshot:

Bild

und muss ich bei eventuellen änderungen auch bei der de/serialisation etwas beachten?

gruss, thehappy

Antworten