Construction Set Spielersteuerung per Script

Fellan

Freund des Hauses
Folgendes Szenario: Der Spieler klickt eine Tür an, der Spieler bekommt eine Nachricht: "Die Tür ist verschlossen und hat ein Schloss, das du noch nie zuvor gesehen hast. Möchtest du versuchen, das Schloss aufzubrechen?", "Ja", "Nein".

Wenn der Spieler auf "Ja" geht, soll erstmal ein "DisablePlayerControls" den Spieler an irgendwelchen Aktionen hindern.

Da der Spieler jetzt mit "F" (Standard) seine Waffe nicht ziehen kann, soll das der Script für ihn übernehmen. Falls der Spieler die Waffe schon gezogen hat, bleibt das so - vielleicht gibt es ja wie "IsSneaking" auch ein "HasWeaponEquipped" oder so ähnlich.

Jetzt soll der Spieler drei Mal hintereinander zuschlagen - unabhängig, was für eine Waffe er da hält, ob er überhaupt eine Waffe in der Hand hat oder einen Bogen benutzt. Danach ist mit "EnablePlayerControls" wieder alles beim alten.

Der Script würde also in etwa so aussehen:

Code:
scn TürSchlagScript

short done1
short done2
short done3
short done4
short init
float timer

begin onActivate Player

if init == 0
   MessageBox "Die Tür ist verschlossen und hat ein Schloss, das du noch nie zuvor gesehen hast. Möchtest du versuchen, das Schloss aufzubrechen?", "Ja", "Nein"
   set init to 1
endif

end



begin GameMode

if init == 1
   set timer to 5
   set init to 2
elseif init == 2
   if timer > 0
      set timer to timer - GetSecondsPassed

         if timer < 4 && done1 == 0
            ;if Player.[B]HasWeaponEquipped[/B] == 1 ;den Befehl gibt es wohl nicht, er soll abfragen, ob der Spieler mit "F" (Standard) die Waffe gezogen hat, oder nicht.
               ;do nothing!, außer...
               set init to 0 ;damit das ganze auch nochmal funktioniert
            ;elseif Player.[B]HasWeaponEquipped[/B] == 0
               ;Player.[B]PressButton WeaponEquip[/B] ;den Befehl gibt es wohl auch nicht, er soll den Spieler die Waffe ziehen lassen, als wenn er "F" (Standard) drücken würde.
             ;endif
             set done1 to 1
         endif

         if timer < 3 && done2 == 0
            ;Player.[B]PressButton Attack[/B] ;den Befehl gibt es wohl genausowenig, er soll den Spieler angreifen lassen, als wenn er die linke Maustaste drückt (Standard)
             set done2 to 1
         endif

         if timer < 2 && done3 == 0
            ;Player.[B]PressButton Attack[/B]
            set done3 to 1
         endif

         if timer <= 1 && done4 == 0
            ;Player.[B]PressButton Attack[/B]
            set done4 to 1
         endif
   else
      MessageBox "Die Tür hat nichtmal einen Kratzer..."
      set done1 to 0
      set done2 to 0
      set done3 to 0
      set done4 to 0
      set init to 0 ;das alles, damit das ganze immer wieder funktioniert
   endif
endif

end


Anmerkung: Die Befehle "PressButton Button-Name" und "HasWeaponEquipped" gibt es wahrscheinlich nicht - aber wie heißen die richtigen Befehle dafür? Oder ist das nicht möglich? Oder gibt es einen "Workaround" für die Tür-Aufschlag-Geschichte?
 
Also ich werde mich mal daran wagen. Ich möchte aber vorher sagen, dass ich deinen Script nicht gelesen habe, da mir das zu anstrengend war^^
Code:
scn SCRIPT

short doonce
short button

Begin OnActivate player
if doonce == 0
   MessageBox "Die Tür ist verschlossen und hat ein Schloss, das du noch nie zuvor gesehen hast. Möchtest du versuchen, das Schloss aufzubrechen?", "Ja", "Nein"
   set doonce to 1
endif
End

Begin GameMode

set button to getbuttonpressed

If doonce == 1
disableplayercontrols
If button == 0
If player.getEquipped Waffe == 0;Den Befehl weiß ich leider nicht, um ab zu fragen, ob der spieler eine Waffe trägt
player.Equip Waffe ;der Spieler soll seine Waffe ziehen, doch weiß ich nicht, wie
Endif
set doonce to 2
else
set doonce to 0
Endif
Endif

If doonce == 2
player.playGroup AttackPower 0
player.playGroup AttackPower 0
player.playGroup AttackPower 0
set doonce to 0
enableplayercontrols
Endif

End

Ich hoffe, das hilft dir... :?

MfG Gildur
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Fellan
IsWeaponOut kannst du nehmen um zu prüfen ob der Spieler eine Waffe in der hand hat.

Das Problem mit dem player.equip Waffe ist das man da nur mit OBSE halbwegs drumrum kommt.
Ne andere Möglichkeit is dann nur das der Spieler auf die Tür mit seinen Händen einprügelt.

Oder es liegt ein Knüppel am Boden und der Spieler "hebt" den auf und hat ihn im Inventar. Damit kann er dann auf die Tür trümmern.

:)

Gruß sinHHHans
 
  • Like
Reaktionen: Fellan
Gildur schrieb:
Ich möchte aber vorher sagen, dass ich deinen Script nicht gelesen habe, da mir das zu anstrengend war

Ich finde, meine Art, die Scripts zu schreiben, ist eine der übersichtlichsten, besonders wenn ich hier im Forum andere Scripts sehe. ;)

Danke aber für die Hilfe, jetzt weiß ich, wie ich den Spieler angreifen lasse.

@sinHHHans: Danke erstmal für den Befehl.

Du sagst, der Spieler kann mit dem Knüppel, der am Boden liegt, auf die Tür einschlagen. Warum kann er das nicht mit der beliebigen Waffe - ob Fäuste, Bogen oder sonstwas - die er ausgerüstet hat? Gibt es denn kein "GetWeaponOut" o.ä., das den Spieler veranlasst, die Waffe zu ziehen?
 
Afaik nich, bei OBSE gibts bisschen was für Inventar Sachen.
Es Gibt GetEquippedObject [ItemSlot]

Der Waffen slot ist 16

Also kannst du es so machen:
Code:
ref Waffe


...

set Waffe to GetEquippedObject 16
player.equip Waffe
if player.IsWeaponOut == 1
message" dann hatte der player eine Waffe equipped und hat sie gezogen ,( glaub ich )"
else
 message " du hast immernoch das gleiche Problem "

endif

Ne OBSE frei Lösung fällt mir da nicht ein :(

Gruß sinHHHans :)
 
OBSE ist in meinen Augen verbreitet genug, dass man es benutzen könnte.

Ist der Weapon-Slot "16" denn auch für die bloßen Fäuste, falls man keine Waffe angelegt hat?
 
Naja theorerisch würden die Fäuste dann als Wert 0 ergeben,

also
Code:
if Waffe != 1
;player hat ne Waffe zum ziehen

elseif Waffe == 0
; player kann nur mit Fäusten angreifen

endif

Aber es ist klar das es da noch was gibt das du irgendeine Waffe im Inventar des Spielers bekommst.(OBSE halt)

Z.b. Könntest du eine Unsichtbare Kopie des Spielers erstellen, die dann in Angriffsstelung bringen mit setalert 1

Also
Code:
ref Kopie
ref Waffe

...
set Kopie to player.createfullactorCopy
Kopie.saa 0
Kopie.setscale 0.5
Kopie.setalert 1
set Waffe to Kopie.GetEquippedObject 16
player.equip WAffe
vll musst du hier nach jedem Befehl einen frame vergehen lassen, aber das musst du probieren
Ich hoffe ich konnte dir weiter helfen

Gruß sinHHHans
:)
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Fellan