-
NPC soll Waffe bei Animation nicht einstecken
Hallo liebe Community,
ich habe vor kurzer Zeit eine "Wache mit Hellebarde" Animation in die Modderdatenbank hochgeladen. Nach einer Anfrage von und daraus angeregtem eigenem Interesse stelle ich mir die Frage ob es möglich ist das der NPC die Hellebarde nicht wegsteckt wenn der Hero ihn anquatscht.
Das es möglich ist wissen wir ja, da es mit sämtlichen "BS_SIT" ebenso funktioniert.
Meine kläglichen versuche haben nicht funktioniert. Ob sie jetzt sinvoll waren oder nicht sei mal dahingestellt.
Was ich bereits versucht habe:
B_AssessTalk.d
Code:
// **************************************************** // B_AssessTalk
// ------------
// aufgerufen durch Ansprechen (Wahrnehmung ASSESSTALK)
// oder durch B_AssessPlayer (NSC hat Important-Info)
// GILT AUCH FÜR MONSTER
// ****************************************************
func void B_AssessTalk ()
{
// EXIT IF...
// ------- FORBIDDEN: Levelinspektor oder Rockefeller wird ignoriert ------
var C_NPC PCL; PCL = Hlp_GetNpc(PC_Levelinspektor);
var C_NPC PCR; PCR = Hlp_GetNpc(PC_Rockefeller);
if (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(PCL))
|| (Hlp_GetInstanceID(other) == Hlp_GetInstanceID(PCR))
{
PrintScreen (ConcatStrings("Stimme: ", IntToString(self.voice)), -1, 70, FONT_Screen, 2);
PrintScreen ("KEIN HERO!", -1, -1, FONT_Screen, 2);
PrintScreen (IntToString(self.aivar[AIV_FollowDist]), -1, 70, FONT_Screen, 2);
if (C_NpcIsInQuarter (self) == Q_KASERNE)
{
PrintScreen ("Q_KASERNE", -1, 30, FONT_Screen, 2);
};
if (C_NpcIsInQuarter (self) == Q_GALGEN)
{
PrintScreen ("Q_GALGEN", -1, 30, FONT_Screen, 2);
};
if (C_NpcIsInQuarter (self) == Q_MARKT)
{
PrintScreen ("Q_MARKT", -1, 30, FONT_Screen, 2);
};
if (C_NpcIsInQuarter (self) == Q_TEMPEL)
{
PrintScreen ("Q_TEMPEL", -1, 30, FONT_Screen, 2);
};
if (C_NpcIsInQuarter (self) == Q_UNTERSTADT)
{
PrintScreen ("Q_UNTERSTADT", -1, 30, FONT_Screen, 2);
};
if (C_NpcIsInQuarter (self) == Q_HAFEN)
{
PrintScreen ("Q_HAFEN", -1, 30, FONT_Screen, 2);
};
if (C_NpcIsInQuarter (self) == Q_OBERSTADT)
{
PrintScreen ("Q_OBERSTADT", -1, 30, FONT_Screen, 2);
};
return;
};
// ------ Exit-Conditions NUR für Monster
if (self.guild > GIL_SEPERATOR_HUM)
{
// ------ Monster hat keine Info ------
if (Npc_CheckInfo (self, 1) == FALSE)
{
if (Npc_CheckInfo (self, 0) == FALSE)
{
return;
};
};
};
// ------ Exit-Conditions NUR für Humans ------
if (self.guild < GIL_SEPERATOR_HUM)
{
// ------ Spieler ist Enemy ------
if (B_AssessEnemy())
{
return;
};
// ------ Spieler ist Mörder ------
if (B_GetPlayerCrime(self) == CRIME_MURDER)
&& (C_WantToAttackMurder(self, other))
{
B_Attack (self, other, AR_HumanMurderedHuman, 0);
return;
};
if (C_PlayerIsFakeBandit (self,other) == TRUE)
&& (self.guild != GIL_BDT)
{
B_Attack (self,other,AR_GuildEnemy,0);
return;
};
if (C_RefuseTalk(self,other))
{
if C_PlayerHasFakeGuild (self,other)
{
Npc_ClearAIQueue (self);
AI_StartState (self,ZS_CommentFakeGuild , 1, "");
return;
}
else
{
B_Say (self, other, "$NOTNOW");
return;
};
};
};
// FUNC
// ------ Spieler labert NSC an ------
if (self.aivar[AIV_NpcStartedTalk] == FALSE)
{
if ( C_BodyStateContains(self,BS_WALK) || C_BodyStateContains(self,BS_RUN) )
{
B_Say (other,self,"$SC_HEYWAITASECOND");
}
else if (!Npc_CanSeeNpc(self, other))
{
var int rnd; rnd = Hlp_Random(100);
if (rnd <= 25) { B_Say (other,self,"$SC_HEYTURNAROUND"); }
else if (rnd <= 50) { B_Say (other,self,"$SC_HEYTURNAROUND02"); }
else if (rnd <= 75) { B_Say (other,self,"$SC_HEYTURNAROUND03"); }
else if (rnd <= 99) { B_Say (other,self,"$SC_HEYTURNAROUND04"); };
};
};
Npc_ClearAIQueue (self);
B_ClearPerceptions (self);
// ------ NSC bleibt sitzen oder steht in Ruhe auf bzw. beendet Mobsi in Ruhe -----------------
if (C_BodyStateContains(self, BS_SIT))
{
if (self.aivar[AIV_NpcStartedTalk] == TRUE)
{
AI_StandUpQuick (other); //Spieler anhalten
}
else
{
AI_StandUp (other); //Spieler anhalten
};
if (Npc_CanSeeNpc(self, other))
{
AI_StartState (self, ZS_Talk, 0, ""); //sitzenbleiben
}
else //nicht sehen
{
//HACK: Im ObservePlayer kann ein NSC sitzen, ohne daß in der END-Routine des ZS sauber aufgestanden wird (klar, denn ZS_ObservePlayer_End hat kein StandUp o.ä. - darf dies auch nicht haben)
if (Npc_IsInState (self, ZS_ObservePlayer))
{
AI_StandUp (self);
};
AI_StartState (self, ZS_Talk, 1, ""); //aufstehen
};
return;
}
else //nicht sitzen
{
if (self.aivar[AIV_NpcStartedTalk] == TRUE)
{
AI_StandUpQuick (self);
AI_StandUpQuick (other); //Spieler anhalten
}
else
{
AI_StandUp (self);
AI_StandUp (other); //Spieler anhalten
};
AI_StartState (self, ZS_Talk, 0, ""); //sitzenbleiben
return;
};
if (Npc_IsInState (self, ZS_STAND_HALBERD))
{
AI_StartState (self, ZS_Talk, 0, ""); //ohne Hellebarde wegstecken reden
};
};
-> Keine Änderung im Spiel
ZS_Talk.d
Code:
// ********************// ZS_Talk
// -------
// wird von Humans
// UND Monstern benutzt
// ********************
// ------------------
var int zsTalkBugfix; //s.u.
// ------------------
FUNC void ZS_Talk ()
{
// --- Keine Wahrnehmungen angemeldet ---
// EXIT IF...
// ------ Spieler spricht schon mit jemand anderem ------
if (other.aivar[AIV_INVINCIBLE] == TRUE)
{
return;
};
// FUNC
// ------ damit kein Dialogteilnehmer angegriffen wird ------
self.aivar[AIV_INVINCIBLE] = TRUE;
other.aivar[AIV_INVINCIBLE] = TRUE;
// ------ NUR bei Humans ------
if (self.guild < GIL_SEPERATOR_HUM)
{
// ------ NSC sieht Spieler an (funzt auch im Sitzen) ------
if (C_BodyStateContains (self, BS_SIT))
{
var C_NPC target; target = Npc_GetLookAtTarget(self);
if (!Hlp_IsValidNpc(target))
{
AI_LookAtNpc (self, other);
};
}
else
{
B_LookAtNpc (self, other);
};
// ------ NSC steckt ggf. Waffe weg ------
AI_RemoveWeapon (self);
};
if (Npc_IsInState (self, ZS_STAND_HALBERD))
{
var C_NPC targetHalberd; targetHalberd = Npc_GetLookAtTarget(self);
if (!Hlp_IsValidNpc(targetHalberd))
{
AI_LookAtNpc (self, other);
};
}
else
{
B_LookAtNpc (self, other);
};
// ------ NSC dreht sich zum Spieler ------------------------------------------
if (!C_BodystateContains(self, BS_SIT))
{
B_TurnToNpc (self, other);
};
// ------ Spieler dreht sich zum Npc ------------------------------------------
if (!C_BodystateContains(other, BS_SIT))
{
B_TurnToNpc (other, self);
// ------ Spieler zu nah dran ------
if (Npc_GetDistToNpc(other,self) < 80)
{
AI_Dodge (other);
};
};
// ------ NUR bei Humans ------
if (self.guild < GIL_SEPERATOR_HUM)
{
// ------ Set Face Expression ------
if (Npc_GetAttitude(self, other) == ATT_ANGRY)
|| (Npc_GetAttitude(self, other) == ATT_HOSTILE)
{
if (!C_PlayerIsFakeBandit(self, other))
|| (self.guild != GIL_BDT)
{
Mdl_StartFaceAni (self, "S_ANGRY", 1, -1);
};
};
// ------ Ambient Infos zuweisen ------
if (self.npctype == NPCTYPE_AMBIENT)
|| (self.npctype == NPCTYPE_OCAMBIENT)
|| (self.npctype == NPCTYPE_BL_AMBIENT)
|| (self.npctype == NPCTYPE_TAL_AMBIENT)
{
B_AssignAmbientInfos (self);
// ------ Cityguide -------
if (C_NpcBelongsToCity(self))
{
B_AssignCityGuide(self);
};
};
// ------ Heiltrank geben können ------
if (self.aivar[AIV_PARTYMEMBER] == TRUE)
//&& (Hlp_GetInstanceID (self) != Hlp_GetInstanceID (Biff))
//&& (Hlp_GetInstanceID (self) != Hlp_GetInstanceID (Biff_NW))
//&& (Hlp_GetInstanceID (self) != Hlp_GetInstanceID (Biff_DI))
//&& (Hlp_GetInstanceID (self) != Hlp_GetInstanceID (Pardos))
//&& (Hlp_GetInstanceID (self) != Hlp_GetInstanceID (Pardos_NW))
{
B_Addon_GivePotion(self);
};
// ------ ToughGuy NEWS zuweisen -------
if (C_NpcIsToughGuy (self))
&& (self.aivar[AIV_ToughGuyNewsOverride] == FALSE)
{
B_AssignToughGuyNEWS (self);
};
// ------ Ambient NEWS zuweisen -------
if (C_NpcHasAmbientNews(self))
{
B_AssignAmbientNEWS (self);
};
};
if (self.guild == GIL_DRAGON)
{
AI_PlayAni (self, "T_STAND_2_TALK");
};
/*
if (self.aivar[AIV_TalkedToPlayer] == TRUE) && ...
{
B_Say (self,other,"$ABS_COMMANDER"); //Ich hörte, du warst beim Kommandanten und hast die Sache wieder in Ordnung gebracht.
B_Say (self,other,"$ABS_MONASTERY"); //Ich hörte, du warst bei Vater Parlan und hast Buße getan..
B_Say (self,other,"$ABS_FARM"); //Ich hörte, du warst bei Lee und und hast die Sache wieder in Ordnung gebracht.
ABS_GOOD //Das ist gut!
};
*/ // *** FIXME ***
// ------ START Multiple Choice Dialog ------
AI_ProcessInfos(self);
zsTalkBugfix = FALSE; //var resetten!
};
func INT ZS_Talk_Loop ()
{
if (InfoManager_HasFinished())
&& (zsTalkBugfix == TRUE) //verhindert, daß InfoManager_HasFinished im ERSTEN FRAME der Loop abgefragt wird --> führt sonst bei MOB-SITZENDEN NSCs (kein Scheiss) zu Abbruch der Loop im ERSTEN FRAME!
//(Problem besteht wegen falscher Reihenfolge der Befehle AI_ProcessInfos und InfoManager_HasFinished)
{
self.aivar[AIV_INVINCIBLE] = FALSE;
other.aivar[AIV_INVINCIBLE] = FALSE;
self.aivar[AIV_NpcStartedTalk] = FALSE;
self.aivar[AIV_TalkedToPlayer] = TRUE;
// ------ NUR bei Humans ------
if (self.guild < GIL_SEPERATOR_HUM)
{
B_StopLookAt (self);
Mdl_StartFaceAni (self, "S_NEUTRAL", 1, -1); //Reset Face Expression
};
if (self.guild == GIL_DRAGON)
{
AI_PlayAni (self, "T_TALK_2_STAND");
};
return LOOP_END;
}
else
{
zsTalkBugfix = TRUE;
return LOOP_CONTINUE;
};
};
FUNC VOID ZS_Talk_End ()
{
// ------ damit nicht nach Dialog+Losgehen gegrüßt wird ------
Npc_SetRefuseTalk(other,20); //BEACHTEN: other ist Spieler!
// ------ wenn Spieler in meinem Raum ------
if (C_NpcIsBotheredByPlayerRoomGuild(self))
|| ( (Wld_GetPlayerPortalGuild() == GIL_PUBLIC) && (Npc_GetAttitude(self,other) != ATT_FRIENDLY) )
{
AI_StartState(self, ZS_ObservePlayer, 0, "");
}
else
{
};
};
Auch das bringt keine Änderung im Spiel
Hat vielleicht jemand eine Idee? Wenn ja bitte nicht schüchtern sein und lieber die Idee mit anderen teilen ;-)
EDIT:
hier noch meine ZS_STAND_HALBERD:
Code:
func void ZS_STAND_HALBERD (){
Perception_Set_Normal();
B_ResetAll (self);
AI_SetWalkmode (self,NPC_WALK);
if (Npc_GetDistToWP (self,self.wp) > TA_DIST_SELFWP_MAX)
{
AI_GotoWP (self, self.wp);
};
self.aivar[AIV_TAPOSITION] = NOTINPOS;
};
func int ZS_STAND_HALBERD_loop ()
{
if (Npc_IsOnFP (self, "STAND"))
{
AI_AlignToFP (self);
if (self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
{
self.aivar[AIV_TAPOSITION] = NOTINPOS;
};
}
else if (Wld_IsFPAvailable(self,"STAND"))
{
AI_GotoFP (self, "STAND");
AI_StandUp (self);
AI_AlignToFP (self);
self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;
}
else
{
AI_AlignToWP (self);
if (self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK )
{
self.aivar[AIV_TAPOSITION] = NOTINPOS;
};
};
if ((self.aivar[AIV_TAPOSITION] == NOTINPOS)
&& (Npc_IsOnFP (self, "STAND")))
{
if ((Npc_HasItems (self, ItMw_Hellebarde) == 0)
&& (self.aivar[AIV_MM_REAL_ID]!= ID_ORCWARRIOR))
{
CreateInvItems (self, ItMw_Hellebarde, 1);
//EquipItem (self, ItMw_Hellebarde);
AI_EquipBestMeleeWeapon (self);
}
else if ((Npc_HasItems (self, ItMw_2H_OrcAxe_05) == 0)
&& (self.aivar[AIV_MM_REAL_ID] == ID_ORCWARRIOR))
{
CreateInvItems (self, ItMw_2H_OrcAxe_05, 1);
//EquipItem (self, ItMw_Hellebarde);
AI_EquipBestMeleeWeapon (self);
};
AI_ReadyMeleeWeapon (self);
AI_AlignToFP (self);
AI_StandUp (self);
AI_PlayAni (self,"T_STAND_2_HALBERD");
self.aivar[AIV_TAPOSITION] = ISINPOS;
};
return LOOP_CONTINUE;
};
mfg
SpikeZz
Geändert von SpikeZz (08.01.2020 um 16:07 Uhr)
-
Hey, ich konnte mir den Code noch nicht wirklich durchlesen, weil ich gerade vom Handy aus schaue.
Könnte es vielleicht einfach sein, dass deine Abfrage (ob sich der NPC in entsprechender Position befindet) einfach zu spät kommt und der NPC (wegen vorheringen Abfragen) die Waffe schon wegsteckt?
Ansonsten nochmal vielen Dank für diese coole Animation!
-
Zitat von Fisk2033
Hey, ich konnte mir den Code noch nicht wirklich durchlesen, weil ich gerade vom Handy aus schaue.
Könnte es vielleicht einfach sein, dass deine Abfrage (ob sich der NPC in entsprechender Position befindet) einfach zu spät kommt und der NPC (wegen vorheringen Abfragen) die Waffe schon wegsteckt?
Ansonsten nochmal vielen Dank für diese coole Animation!
Danke für den Tipp. Hab ich versucht, jedoch Fehlanzeige. Keine veränderung.
-
I feel like quality of google translations is getting worse recently - sorry if I misunderstood your problem
I understand you are having issue where NPC putaways weapon - and you don't want that when you approach NPC with halberd.
AI_RemoveWeapon is removing weapon - you can check if NPC was in state ZS_STAND_HALBERD and if yes you don't have to remove weapon. Also noticed that you are checking if Npc_IsInState inside of ZS_Talk state - this will not work, since state is already ZS_Talk you need to use instead NPC_WasInState.
Before AI_ProcessInfos you might have to restore animation T_STAND_2_HALBERD. However this will look little bit clumsy, since AI_Turn is changing animation, but better than nothing.
Code:
func void ZS_Talk ()
{
var C_Npc target;
if (other.aivar [AIV_INVINCIBLE] == TRUE)
{
return;
};
self.aivar [AIV_INVINCIBLE] = TRUE;
other.aivar [AIV_INVINCIBLE] = TRUE;
if (self.guild < GIL_SEPERATOR_HUM)
{
if (C_BodyStateContains (self, BS_SIT))
{
target = Npc_GetLookAtTarget (self);
if (!Hlp_IsValidNpc (target))
{
AI_LookAtNpc (self, other);
};
}
else
{
B_LookAtNpc (self, other);
};
if (!NPC_WasInState (self, ZS_STAND_HALBERD))
{
AI_RemoveWeapon (self);
};
};
...
if (NPC_WasInState (self, ZS_STAND_HALBERD))
{
AI_PlayAni (self, "T_STAND_2_HALBERD");
};
AI_ProcessInfos (self);
zsTalkBugfix = FALSE;
};
[Video]
Geändert von F a w k e s (08.01.2020 um 18:00 Uhr)
-
Zitat von F a w k e s
I feel like quality of google translations is getting worse recently - sorry if I misunderstood your problem
I understand you are having issue where NPC putaways weapon - and you don't want that when you approach NPC with halberd.
AI_RemoveWeapon is removing weapon - you can check if NPC was in state ZS_STAND_HALBERD and if yes you don't have to remove weapon. Also noticed that you are checking if Npc_IsInState inside of ZS_Talk state - this will not work, since state is already ZS_Talk you need to use instead NPC_WasInState.
Before AI_ProcessInfos you might have to restore animation T_STAND_2_HALBERD. However this will look little bit clumsy, since AI_Turn is changing animation, but better than nothing.
Code:
func void ZS_Talk ()
{
var C_Npc target;
if (other.aivar [AIV_INVINCIBLE] == TRUE)
{
return;
};
self.aivar [AIV_INVINCIBLE] = TRUE;
other.aivar [AIV_INVINCIBLE] = TRUE;
if (self.guild < GIL_SEPERATOR_HUM)
{
if (C_BodyStateContains (self, BS_SIT))
{
target = Npc_GetLookAtTarget (self);
if (!Hlp_IsValidNpc (target))
{
AI_LookAtNpc (self, other);
};
}
else
{
B_LookAtNpc (self, other);
};
if (!NPC_WasInState (self, ZS_STAND_HALBERD))
{
AI_RemoveWeapon (self);
};
};
...
if (NPC_WasInState (self, ZS_STAND_HALBERD))
{
AI_PlayAni (self, "T_STAND_2_HALBERD");
};
AI_ProcessInfos (self);
zsTalkBugfix = FALSE;
};
[Video]
ok, yes this almost works. Just one little Problem left. When i end the Dialog then he Remove hist weapon and start the animation again.
i also made an video of my problem now
[Video]
Geändert von SpikeZz (08.01.2020 um 18:46 Uhr)
-
Hi SpikeZz,
Seems like B_ResetAll is removing weapon as well - so when NPC goes back to ZS_STAND_HALBERD weapon is removed when this function is called:
Code:
func void B_ResetAll(var C_Npc slf)
{
B_StopLookAt(slf);
AI_RemoveWeapon(slf);
};
Try to change it like this ->
Code:
func void B_ResetAll(var C_Npc slf)
{
B_StopLookAt(slf);
if (!NPC_IsInState (slf, ZS_STAND_HALBERD))
{
AI_RemoveWeapon (slf);
};
};
Geändert von F a w k e s (15.01.2022 um 21:25 Uhr)
-
Zitat von F a w k e s
Hi SpikeZz,
Seems like B_ResetAll is removing weapon as well - so when NPC goes back to ZS_STAND_HALBERD weapon is removed when this function is called:
Code:
func void B_ResetAll(var C_Npc slf)
{
B_StopLookAt(slf);
AI_RemoveWeapon(slf);
};
Try to change it like this ->
Code:
func void B_ResetAll(var C_Npc slf)
{
B_StopLookAt(slf);
if (!NPC_IsInState (self, ZS_STAND_HALBERD))
{
AI_RemoveWeapon (self);
};
};
Ok, thanks that almost fixed my Problem. Now the Npc just interrupt shortly at the beginning and at the end of an dialog. Can this be Fixed. If not i would deal with it.
Here you can see what it looks like now:
[Video]
-
That short interruption is caused I believe by AI_Turn, seems like it is endning S_HALBERD animation and applying STAND animation, not sure how to tweak this, maybe with some transition animation? This goes beyond my knowledge
Geändert von F a w k e s (08.01.2020 um 22:14 Uhr)
-
Das mit der anderen animation könnte man ja so machen... an sich klappt das ja schon gut
-
Ich habe gerade noch einen fehler im dem Skript gefunden... das mit der Hellebarde klappt jetzt zwar, aber nun kann man keine Tiere, wie Lisel das Schaf oder bei meiner mod, ein Pferd ansprechen.
der Hed sagt nur Hey...aber es kommt kein dialog mehr sondern das Tier frisst weiter
Hat da jemand eine Lösung?
-
Hat keiner eine Lösung
-
Danke Spike für die Hellebarden Animation!
Ich hab jetzt noch ein Problem bezüglich der Animation, weil ich mit meinen Hellebarden auch kämpfen können will. Siehe Video:
[Video]
Meine zwei Hellebarden sind von der Länge her so wie deine Spike, aber die Location des Objekts der 3DS ist anders, damit man mit den Hellebarden auch kämpfen bzw. sie auf dem Rücken tragen kann.
Wenn die NPCs nun mit meinen Hellebarden die Animation ausführen, halten sie die Waffen halt in die Höhe statt sie auf dem Boden abzustellen, wie eigentlich gedacht.
Hat jemand für dieses Problem vielleicht eine Lösung?
edit: Hier zu Veranschaulichung noch eine zweites Video. Ich habe die Hellebarden an die Animation angepasst, aber kämpfen sieht dann damit halt blöd aus. Gibt es ein Möglichkeit die Animation irgendwie abzuändern, sodass die NPCs die Hellebarden tiefer nehmen? Dann könnte man mit den Hellebarden auch kämpfen.
[Video]
Geändert von Moe (20.03.2020 um 20:43 Uhr)
-
Zitat von Moe
Danke Spike für die Hellebarden Animation!
Ich hab jetzt noch ein Problem bezüglich der Animation, weil ich mit meinen Hellebarden auch kämpfen können will. Siehe Video:
[Video]
Meine zwei Hellebarden sind von der Länge her so wie deine Spike, aber die Location des Objekts der 3DS ist anders, damit man mit den Hellebarden auch kämpfen bzw. sie auf dem Rücken tragen kann.
Wenn die NPCs nun mit meinen Hellebarden die Animation ausführen, halten sie die Waffen halt in die Höhe statt sie auf dem Boden abzustellen, wie eigentlich gedacht.
Hat jemand für dieses Problem vielleicht eine Lösung?
edit: Hier zu Veranschaulichung noch eine zweites Video. Ich habe die Hellebarden an die Animation angepasst, aber kämpfen sieht dann damit halt blöd aus. Gibt es ein Möglichkeit die Animation irgendwie abzuändern, sodass die NPCs die Hellebarden tiefer nehmen? Dann könnte man mit den Hellebarden auch kämpfen.
[Video]
Das könnte helfen.
https://forum.worldofplayers.de/foru...7#post16944337
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|