• Anmelden

Josey

Storyteller

  • »Josey« ist der Autor dieses Themas

Motto: "Was du nicht willst, das man dir tu', füge keinem And'ren zu!"

  • Nachricht senden

1

Samstag, 4. Februar 2017, 13:32

[Erledigt] Clone-Event Error[✓] & Anticlonen[geht nicht]

Hallo! :)

Ich versuche grad das Clone-Event-Script zu verwenden.
Dieses:
Spoiler: Events klonen V1.1

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#==============================================================================
# ** Events klonen V1.1
# EventsKlonen.rb von Abt Ploutôn, Monsta (07.08.2008)
#------------------------------------------------------------------------------
# http://www.rpg-studio.de/scriptdb/node/51
# http://www.rpg-studio.de/forum/index.php?page=Thread&threadID=9900
# http://www.rmxp.de/forum/rmxp-de-technik/rgss-skript-datenbank/programmierhilfen/p227129-events-klonen/#post227129
#==============================================================================
 
#-------------------------------------------------------------------------- 
# Events klonen V1 @ Abt Ploutôn
#-------------------------------------------------------------------------- 
 
# Monsta Edit: 1.0 05.06.07
 
# Aufruf:
# $game_map.add_event(map_id,id,x,y)
# ...weitere Events...
# $scene.spriteset.refresh
 
# Neuerungen vom Monsta Edit
# - Man kann sich die ID des neuen Events zurückgeben lassen (@id = $game_map.add...)
# - Bug mit Self Switches bei geklonten Events behoben
# - Die Zeile "$game_map.need_refresh = true" brauch nicht mehr ins Call Skript
# - ID's werden richtig ersetzt (siehe Post SLB)
 
class Spriteset_Map
  #-------------------------------------------------------------------------- 
  def refresh
    $game_map.need_refresh = true
    unless @character_sprites == nil 
      for sprite in @character_sprites 
        sprite.dispose 
      end 
    end
    @character_sprites = [] 
    for i in $game_map.events.keys.sort 
      sprite = Sprite_Character.new(@viewport1, $game_map.events[i]) 
	  @character_sprites.push(sprite) 
    end 
    @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
  end
  #-------------------------------------------------------------------------- 
end
 
class Game_Map
  #-------------------------------------------------------------------------- 
  def add_event(map_id,id,x,y)
    s = 1
    (1..@events.size + 1).each{|s|break unless @events.keys.include?(s)}
    map = load_data(sprintf("Data/Map%03d.rxdata", map_id)) 
    ev = map.events[id] 
    ev.id = s 
    @events[s] = Game_Event.new(@map_id, ev)
    @events[s].moveto(x, y)
    return @events[s].id
  end 
  #-------------------------------------------------------------------------- 
end
 
class Scene_Map 
  #-------------------------------------------------------------------------- 
  attr_accessor :spriteset 
  #-------------------------------------------------------------------------- 
end
zum Lesen den Text mit der Maus markieren


Es funktioniert auch wunderbar, die Events werden an die richtige Stelle geklont und dank dem Add-On von Irrlicht bleiben sie auch nach dem Mapwechsel auf der Map:

Spoiler: Add-On

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Game_Map
 
  alias_method(:initialize_ILC13122010, :initialize) unless private_method_defined?(:initialize_ILC13122010)
  alias_method(:setup_ILC13122010, :setup) unless method_defined?(:setup_ILC13122010)
  alias_method(:add_event_ILC13122010, :add_event) unless method_defined?(:add_event_ILC13122010)
 
  def initialize
    initialize_ILC13122010
    @saved_clones = Hash.new
  end
 
  def setup(map_id)
    setup_ILC13122010(map_id)
    sce = @saved_clones[map_id]
    sce.each {|se| add_event_ILC13122010(*se)} unless sce.nil?
  end
 
  def add_event(*args)
    if args.size == 5 and args.pop
      sc = @saved_clones
      sc[@map_id].nil? ? sc[@map_id] = [args] : sc[@map_id].push(args)
    end
    add_event_ILC13122010(*args)
  end
end
zum Lesen den Text mit der Maus markieren



Jetzt bekomme ich allerdings Fehlermeldungen. Einmal taucht diese auf, wenn ich das Flat-Event-Script von Monsta drin habe:
---------------------------
Script 'Flatevent by Monsta' line 57: NoMethodError occurred.

undefined method `name' for nil:NilClass
---------------------------
Der Fehler erscheint, wenn ich auf die Map zurückkehren will, auf der das Event geklont wurde.

Spoiler: Flat-Event

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#========Flat-Events Script=======#
#===========by Monsta==========#
#=====Version 1.2=== 25.1.2007 ===#
#=======www.Monsta.aw3.de======#
 
# Benutzung:
# 1. Dieses Skript über Main einfügen
# 2. Sich einen oder mehrere Namen für die untersten Events aussuchen
# 3. Diesen Namen hier bei "FLAT_EVENTS" eintragen (Array)
# 4. Events im Spiel mit diesem Namen benennen
# 5. Sich freuen und mich in die Credits schreiben ;-)
 
# Anmerkung:
# Man kann diese Einstellung auch noch während des Spiels ändern.
# Einfach in ein Eventskript folgenden Code eingeben:
# $game_map.make_flat(*id*,*true / false*)
# Das "*id*" muss durch die ID des Events ersetzt werden.
# Für die Angabe der ID gibt es mehrere Möglichkeiten:
 
# 1. Nummer : Eine Einzelne ID die abgearbeitet wird. z.B.
# $game_map.make_flat(5)
 
# 2. Array: Alle ID's im Array werden abgearbeitet. z.B.
# $game_map.make_flat([1,3,5])
 
# 3. Range: Alle ID's im Rangebereich werden abgearbeitet. z.B.
# $game_map.make_flat(3..7)
 
# 4. String: Mit dem String "all" werden alle Events abgearbeitet. z.B.
# $game_map.make_flat("all")
 
# Der 2. Parameter gibt an, ob das Event Flach werden soll, oder ob
# es wieder in den normalzustand gemacht werden soll.
# Wenn der 2. Parameter wie in den obigen Beispielen nicht angegeben wird,
# wird er automatisch auf "true" gesetzt. Wenn man also die "Flache"
# Eigenschaft von einem Event entfernen will, muss der Aufruf einen
# 2. Parameter haben. z.B.
# $game_map.make_flat(5,false)
 
# Außerdem kann man den Events noch eigene Z Werte zuweisen. z.B.
# $game_map.make_z(*id*,*Z Wert*)
# Die ID Werte können genau wie die ID Werte bei der Flat Methode verwendet
# werden. z.B.
# $game_map.make_z(2..4,9999)
 
# Möchte man, dass das Event aber wieder eine normale Z Berechnung bekommt,
# muss man es so aufrufen:
# $game_map.make_z(2..4,nil)
 
class Game_Map
 attr_reader :map
 FLAT_EVENTS = ["Flat"]
 alias original_setup setup
 def setup(map_id)
  original_setup(map_id)
  $game_map.events.values.each {|ev|$game_map.events[ev.id].flat = 
  FLAT_EVENTS.include?($game_map.map.events[ev.id].name)}
 end
 def make_flat(id,flat=true)
   if id.is_a?(Numeric)
    $game_map.events[id].flat = flat
   elsif id.is_a?(Array) or id.is_a?(Range)
    id.each {|i| $game_map.events[i].flat = flat}
   elsif id.is_a?(String) and id.downcase == "all"
    $game_map.events.values.each {|i|$game_map.events[i.id].flat = flat}
  end    
 end
 def make_z(id,z)
   if id.is_a?(Numeric)
    $game_map.events[id].own_z = z
   elsif id.is_a?(Array) or id.is_a?(Range)
    id.each {|i| $game_map.events[i].own_z = z}
   elsif id.is_a?(String) and id.downcase == "all"
    $game_map.events.values.each {|i|$game_map.events[i.id].own_z = z}
  end
 end
end
 
class Game_Character
 attr_accessor :flat
 attr_accessor :own_z
 alias flat_original_screen_z screen_z
 def screen_z(height = 0)
  return @own_z if @own_z != nil
  return 0 if @flat
  flat_original_screen_z(height)
 end
end
zum Lesen den Text mit der Maus markieren



Und dann hätte ich da diesen Fehler, wenn ich klonen will:
---------------------------
Script 'HideandSeek v2.1 by Coconut' line 358: NoMethodError occurred.

undefined method `name' for nil:NilClass
---------------------------

Spoiler: HideandSeek

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
#==============================================================================
# Sichtweite plus Sichtblockevents Script
# "Hide and Seek" - Script
#------------------------------------------------------------------------------
# By Hüpfende Kokosnuss || Jumping Coconut 
# 8. June 2009,  Version 2.1
#==============================================================================
=begin
 
                            Deutsche Erkärung
                            =================
 
Dieses Skript sorgt dafür, dass ihr eine Art Versteckspiel
ganz einfach basteln könnt. Wie z.B. bei Zelda Ocarina of Time oder in 
etlichen anderen Spielen. Das Prinzip hierbei ist immer:
Der Spieler darf von den Events nicht gesehen werden, kann sich aber
hinter gewissen Gegenständen verstecken.
Es gibt hier 2 Arten von Events, die neuerdings sogar Kombiniert werden
können:
 
Seek-Events ("Suchende Events"): Diese Events "suchen" den Spieler.
                                 Wenn sie den Spieler sehen, starten sie sich.
                                 Man kann bei Seekern viele Dinge einstellen, 
                                 zum Beispiel die Sichtweite.
Hide-Events ("Versteck-Events"): Steht ein Hide-Event zwischen dem Spieler 
                                 und einem Seek-Event, so wird das Seek-Event
                                 den Spieler nicht "sehen" und kann sich somit
                                 nicht starten.
 
Außerem kann man Terrain-Tags einstellen, welche die selben Fähigkeiten wie
ein Hide-Event haben (etwa ein Baum).
 
 
Allgemeines zur Definition von Hide- und Seek-Events
----------------------------------------------------
 
Hide- und Seek-Events definiert man durch den Eventnamen (gilt dann für alle
Eventseiten) oder durch Kommentare auf einer Eventseite (gilt dann nur für 
die entsprechende Eventseite). Hier nimmt man auch alle Einstellungen, wie
zum Beispiel Sichtweite und Sichtwinkel, vor.
Der Eventname muss immer angepasst werden. Entweder man nimmt die Einstellungen
direkt im Eventnamen vor, oder der Eventname muss ein Schlüsselwort für 
Kommentare enthalten. Nur Events, deren Namen dieses Kommentar-Schlüsselwort
enthält, werden auf ihre Kommentare hin untersucht.
Beispiele von Eventnamen für Hide- and Seekevents:
 
 
Eventname:  Hide Seek 5 90 7
             |     |   \ | /
             |     |  Reaktionszeit 5 Sek., Sichtwinkel 90°, Sichtweite 7 Tiles
             |   Event ist ein Seeker (löst sich aus, wenn es den Spieler sieht)
            Event ist undurchsichtig für andere Seeker
 
 
Eventname:  Bla bla Event bla Comment:5 bla bla
                   |             |
             Sinnloser Kram      |
                      Hide- and Seekanweisungen befinden sich in Kommentaren
                      auf den jeweiligen Eventseiten, die 2 gibt an, dass der
                      jeweilige Kommentar sich innerhalb der ersten 5 
                      Eventbefehle befindet
 
 
Die selben Befehle wie für Eventnamen können auch für Kommentare verwendet 
werden. Zu beachten hierbei ist, dass bei Kommentaren alle Befehle in EINER
Kommentarzeile stehen müssen!
Die Reihenfolge ist egal, außer bei Reaktionszeit, Sichtwinkel und Sichtweite.
Diese müssen, wenn sie überhaupt angegeben werden, IMMER die letzten 3 Werte
bilden. Zuerst wird die Reaktionszeit angegeben (ist 0 wenn sie fehlt), dann
der Sichtwinkel, dann die Sichtweite. Siehe hierzu auch das erste Beispiel.
Folgende Schlüsselworte können angegeben werden:
  - Hide     = Event ist ein Hide-Event, also blockiert es die Sicht der Seeker.
  - Seek     = Event ist ein Seeker, löst also aus, wenn Spieler in Sichtweite.
  - Circle   = Event sieht in Sichtkreisen (nicht in Sichtdreiecken). Besonders
               nützlich wenn dabei ein Sichtwinkel von 0 angegeben wurde, 
               das ermöglicht dem Seeker nämlich, Kreisförmig in alle Richtungen
               zu schauen (gut für Sensoren, Fallen, etc).
  - Reverse  = Wenn das Seekerevent eigentlich auslösen sollte, löst es nicht
               aus, und wenn es nicht auslösen sollte, löst es aus. Gut für 
               Events, nur agieren sollen, wenn Spieler außer Sichtweite ist.
  - Comment:X= Comment beziehungsweise Comment:X gibt an, dass neben den
               Befehlen im Eventnamen auch die ersten X Befehle des Events
               nach Kommentaren gescannt werden sollen, die Hide-and Seek
               Befehle beeinhalten. Die Angabe von X ist optional, aber
               gut für die Performance!
 
Folgende Werte bilden den Schluss des Eventnamens:
  - Drittletzte Stelle = Reaktionszeit in Sekunden, Seeker-Event löst erst
                         aus, nach dem der Spieler sich bereits X Sekunden
                         im Sichtfeld befindet.
  - Zweitletzte Stelle = Sichtwinkel in Grad. Gültige Werte sind 1-179 Grad.
  - Letzte Stelle      = Sichtweite in Tiles.
 
Alle Schlüsselworte und die Positionen der Werte können unter 
"Hide and Seek SETTINGS" verändert werden.
 
 
Erstellen von "Verstecken" für den Spieler
------------------------------------------
 
Verstecke sind leicht einzurichten. Hide-Events fungieren als Sichtblocker 
(wie diese eingerichtet werden ist ja oben beschrieben).
Um Events zu sparen kann man allerdings auch bestimmte Terrain-Tags vergeben,
welche dann automatisch wie Hide-Events gehandhabt werden.
Man kann sowohl eins als auch mehrere Terrains angeben.
Einstellbar bei den SETTINGS unter: $has_hideterrain
 
 
Neue Eventbefehle (Callscripts)
-------------------------------
 
Für TRUE/FALSE Abfrage in Conditional Branch:
  has_seek(Sichtweite, Sichtwinkel, Circle, Reaktionszeit, Event-ID)
   Manuelle Seek-Abfrage für spezielles Event. Die Bedingung ist dann 
   entweder wahr, wenn der das Event den Spieler unter den entsprechenden
   Bedingungen sieht, oder falsch, wenn dies nicht der Fall ist.
   Reaktionszeit und Event-ID müssen nicht immer angegeben werden, 
   sind dann standardmäßig 0 und die ID des aktuellen Events. Beispiel hierfür:
  has_seek(5, 90, false) 
   => Sichtweite 5, Sichtwinkel 90, gilt für aktuelles Event.
 
  has_seconds_player_seen(Event-ID)
   Gibt als Zahl zurück, wie viele Sekunden der Spieler schon im Sichtfeld des
   entsprechenden Seek-Events ist. Wird die Event-ID nicht angegeben, so 
   wird das aktuelle Event genommen. Beispiel:
  has_seconds_player_seen == 10
   => Conditional Branch ist wahr, wenn der Spieler GENAU 10 Sekunden im 
      Sichtfeld des aktuellen Events ist. Ansonsten kommt der ELSE-Zweig zum 
      tragen. Funtkioniert nur bei Seekern, ist der Spieler nicht im Sichtfeld,
      wird 0 zurückgegeben.
 
Normale Eventbefehle:
  has_set_seconds_player_seen(Sekunden, Event-ID) 
   Setzt die Sekunden, die das Event mit der entsprechenden ID den Spieler schon
   gesehen hat, auf übergebenen Wert.
   Wird nichts übergeben, so setzt es die Sekunden des aktuellen Events auf 0.
  has_set_seconds_player_seen(5, 10)
   => Event mit der ID 10 sieht den Spieler jetzt seit 5 Sekunden. Kann dann
      Beispielsweise mit "has_seconds_player_seen" abgefragt werden.
 
 
Performance
-----------
 
Das Skript verbraucht nicht viel Performance, für das was es leistet. 
Generel gilt, dass Events, die über Eventnamen deklariert sind, weniger
Performance fressen.
Sind Kommentare doch unausweichlich, so sollte auf jedenfall die Funktion 
genutzt werden, den Bereich, in dem Sich der Kommentar befindet, anzugeben
(also mit Comment:X)!
Des weiteren kann man das Skript über Mapnamen an- und ausstellen.
Dann ist das Skript nur auf den Maps aktiv, die das entsprechende
Schlüsselwort beeinhalten (oder nur auf denen, die das Schlüsselwort NICHT
beeinhalten, ist Einstellbar ;D).
Hierfür muss bei den SETTINGS $has_mpkey und $has_mpcon angepasst werden.
Soll das Skript auf allen Maps aktiv sein, empfielt sich, bei $has_mpkey
einfach "" einzutragen und $has_mpcon auf true zu stellen.
 
 
Zur Kompatibilität
------------------
 
Eigentlich funktioniert dieses Skript sogar mit Pixelmovement.
Ich habe es mit f0tz!baerchens Pixelmovement 1.5 getestet, wichtig ist nur,
dass Hide and Seek unter das Pixelmovement- und über das Main- Skript 
gestellt wird.
Es ist sogar zu fast allen vorherigen Hide- and Seek Versionen 
abwärtskompatibel, so dass man alte Hide- and Seek Events nicht noch mal 
umbennen braucht. Es empfiehlt sich aber, die alten Maps trotzdem noch 
zu testen, wenn man von einer alten Hide- and Seek Version auf die aktuelle
umspringt.
 
 
Sonstiges
---------
 
Wenn ein Seek-Event weder einen Kreis noch ein Sichtdreieck bekommt (weil man
einen Winkel größer als 179 oder kleiner als 1 gewählt hat), löst es nur aus,
sobald der Spieler auf das Event drauftritt. Das würde nämlich sogar ein Blinder
merken ^_~
 
Umgekehrt: Wenn der Spieler auf einem Hide-Event steht ist er für
die Seek-Events unsichtbar. Das ist gut für "geschützte Bereiche".
 
Bei allen Schlüsselwörtern wird Groß- und Kleinschreibung nicht beachtet.
 
 
Das ganze System hört sich vielleicht kompliziert an, aber in der Demo gibts 
genug Beispiele, und wenn man sich die Erklärungen hier mal 5 Minuten
durchliest, versteht mans auch! Es ist alles sehr logisch aufgebaut.
Ich wünsche euch allen viel Spaß mit euren jeweiligen Projekten ^^
 
=end
#==============================================================================
# Erwähnt bitte "Hüpfende Kokosnuss" in den Credits.
# Please remember "Jumping Coconut || Hüpfende Kokosnuss" for your credits!
#==============================================================================
 
# ------ Hide and Seek SETTINGS ------
 
 
# - Keywords for Events -
 
# Keyword for Hide-Events
  $has_hdkey = "Hide"
# Keyword for Seek-Events
  $has_skkey = "Seek"
# Keyword for Seighting-Circle (Seek-Event only)
  $has_sckey = "Circle"
# Keyword for Revers-Function (Seek-Event only)
  $has_rvkey = "Reverse"  
# Keyword if event contains Hide-and-Seek specific comments
  $has_cmkey = "Comment"
 
# - Values for Events - 
 
# Follwoing Settings should only be changed if you're sure what you're doing.
# Position where Range is declared (1 for last, 2 for forelast, 3 for ...)
  $has_swpos = 1 
# Position where Angle is declared (1 for last, 2 for forelast, 3 for ...)
  $has_sapos = 2
# Position where Reaction Time is declared (1 for last, 2 for forelast, 3 for ...)
  $has_rtpos = 3
 
# - Other -
 
# Keyword for map ("" for no Keyword)
  $has_mpkey = ""
# TRUE if Keyword has to appear in Map-Name for making Hide and Seek active,
# FALSE if Keyword has to appear in Map-Name for turning Hide and Seek off
  $has_mpcon = true
 
# Hideterrains (these terrains will act like a Hide-Event)
# for example you can write $has_hideterrain = 1 or $has_hideterrain = [4,6,7]
  $has_hideterrain = 
 
# ------ Hide and Seek SETTINGS ------
 
 
#==============================================================================
# ** Game_Map
#------------------------------------------------------------------------------
#  Reading Event-Names for Hide and Seek - Declaration, Checking Seekers
#==============================================================================
class Game_Map
  #--------------------------------------------------------------------------
  # * Adding Public instance Variable, aliasing setup and update method
  #--------------------------------------------------------------------------
  attr_accessor :map
  alias_method(:hk_has_setup , :setup)
  alias_method(:hk_has_update, :update)
  #--------------------------------------------------------------------------
  # * After Setup, checking Event Names
  #--------------------------------------------------------------------------
  def setup(*args)
    hk_has_setup(*args)
    $hide_and_seek = nil
    if map_name.downcase.include?($has_mpkey.downcase) == $has_mpcon
      $hide_and_seek = Hide_and_Seek.new
    end
    unless $hide_and_seek == nil
      @events.each {|id, event|
        unless @map.events[id].name.downcase.include?($has_cmkey.downcase)    
          # Die Namen überprüfen, wenn keine Kommentare geprüft werden sollen
          name = @map.events[id].name.downcase
          seeker = name.include?($has_skkey.downcase)
          hideev = name.include?($has_hdkey.downcase)
          $hide_and_seek.change_unit(id, seeker, hideev)
        end
      }
      # Undurchsichtige Terrains überprüfen
      $hide_and_seek.get_terrains
      # Die Events müssen refreshed werden damit die Kommentare gelesen werden
      for event in @events.values
        event.refresh
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Map_Name  This method returns the map's name
  #--------------------------------------------------------------------------
  def map_name
    return load_data("Data/MapInfos.rxdata")[@map_id].name if @map_id != nil
  end
  #--------------------------------------------------------------------------
  # * Check Seekers each update
  #--------------------------------------------------------------------------
  def update(*args)
    hk_has_update(*args)
    if $hide_and_seek != nil
      $hide_and_seek.check_seekers 
    end
  end
end
 
#==============================================================================
# ** Game_Event
#------------------------------------------------------------------------------
#  Reading Comments for Hide and Seek - Declaration
#==============================================================================
class Game_Event
  #--------------------------------------------------------------------------
  # * Adding Public instance Variable, aliasing refresh and initialize method
  #--------------------------------------------------------------------------
  attr_accessor :hk_has_seen_player_since
  alias_method(:hk_has_refresh, :refresh)
  alias_method(:hk_has_initialize, :initialize)
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     hk_has_seen_player_since : Framecount, starting at the moment when 
  #                                event could see the player          
  #--------------------------------------------------------------------------
  def initialize(*args)
    @hk_has_seen_player_since = 0
    hk_has_initialize(*args)
  end
  #--------------------------------------------------------------------------
  # * If Event hasn't got a Hide and Seek - declared Name, check if it has
  #     a Hide and Seek - declared comment (each new Page)
  #--------------------------------------------------------------------------
  def refresh
    hk_has_refresh
    if $hide_and_seek != nil
      # Gelöschte Events aus den Listen entfernen
      $hide_and_seek.change_unit(@id, false, false) if @erased
      # Kommentare prüfen wenn gewünscht
      if event_name.downcase.include?($has_cmkey.downcase) and list != nil
        # checklistsize aus dem Eventnamen lesen (Schlüsselwort:checklistsize)
        checklistsize = 0
        event_name.split.each do |namepart|
          checklistsize = namepart.split(":")[1].to_i if namepart.include?($has_cmkey)
        end
        # Im Zweifelsfall listsize als checklistsize nehmen nehmen
        if checklistsize <= 0 or (list.size-1) < checklistsize
          checklistsize = (list.size-1)
        end
        seeker = false
        hideev = false
        for i in 0..checklistsize
          if list[i].code == 108 || list[i].code == 408
            unless seeker
              seeker = list[i].parameters[0].downcase.include?($has_skkey.downcase)
            end
            unless hideev
              hideev = list[i].parameters[0].downcase.include?($has_hdkey.downcase)
            end
          end
        $hide_and_seek.change_unit(@id, seeker, hideev)
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Event_Name  This method returns the events's name
  #--------------------------------------------------------------------------
  def event_name
    if $game_map != nil
      return $game_map.map.events[@id].name if @id != nil
    end
  end
end
 
#==============================================================================
# ** Hide_and_Seek
#------------------------------------------------------------------------------
#  This Class handles interaction between User and pure Mathematics
#==============================================================================
class Hide_and_Seek
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     seekers : Array of EventIDs from Seeker-Events
  #     hideevs : Array of EventIDs from Hide-Events
  #     Starting HaS_Geometrie
  #--------------------------------------------------------------------------
  def initialize
    @seekers = []
    @hideevs = []
    $has_geometrie = HaS_Geometrie.new
  end
  #--------------------------------------------------------------------------
  # * Change Unit  Adds or Removes Hide- and Seekevent-IDs
  #     id   : Eventid
  #     seek : True for adding a Seeker, False for removing a Seeker
  #     hide : True for adding a Hideevent, False for removing a Hideevent
  #--------------------------------------------------------------------------
  def change_unit(id, seek, hide)
    @seekers.delete(id) unless seek == nil
    @hideevs.delete(id) unless hide == nil
    @seekers << id if seek
    @hideevs << id if hide
  end
  #--------------------------------------------------------------------------
  # *  Get Terrains  Scanning Map for Hideterrains
  #--------------------------------------------------------------------------
  def get_terrains
    @terrains = []
    terraintags = $has_hideterrain.to_a
    for x in 0..$game_map.map.width
      for y in 0..$game_map.map.height
        if terraintags.include?($game_map.terrain_tag(x,y))
          @terrains << {"x" => x, "y" => y}
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # *  Check Seekers  Reading Seek-Events over ID, filtering their 
  #                   Hide and Seek - Parameters (like seighting-distance)
  #--------------------------------------------------------------------------
  def check_seekers
    if @seekers != nil
      @seekers.each do |i|
        if $game_map.events[i] != nil
          # Je nach Sclüsselwort Eventname oder Kommentare prüfen
          unless $game_map.events[i].event_name.downcase.include?($has_cmkey.downcase)
            seekerstring = $game_map.events[i].event_name.downcase
          else
            # Herausbekommen, wie weit in die Commandlist reingeschaut werden muss
            checklistsize = $game_map.events[i].list.size-1
            $game_map.events[i].event_name.downcase.split.each do |namepart|
              checklistsize = namepart.split(":")[1].to_i if namepart.include?($has_cmkey)
            end
            # Die Commandlist durchgehen und nach entsprechendem Kommentar suchen
            for j in 0..checklistsize
              code = $game_map.events[i].list[j].code
              comment = $game_map.events[i].list[j].parameters[0]
              if (code == 108 || code == 408) and comment.downcase.include?($has_skkey.downcase)
                seekerstring = comment.downcase
                break
              end
            end
          end
          # Jetzt relevante Informationen aus Seekerstring filtern
          # Seek Befehl umkehren?
          reverse = seekerstring.include?($has_rvkey.downcase)
          # Kreisförmige Sicht aktivieren?
          circle = seekerstring.include?($has_sckey.downcase)
          seekerstring = seekerstring.split
          # Range auslesen (positionsbedingt)
          ra = seekerstring[seekerstring.size-$has_swpos].to_i
          # Sichtwinkel auslesen (positionsbedingt)
          sw = seekerstring[seekerstring.size-$has_sapos].to_i
          # Reaction Time auslesen (positionsbedingt)
          rt = seekerstring[seekerstring.size-$has_rtpos].to_i
          # Reaction Time ist in Sekunden, in Frames umrechnen
          rt *= Graphics.frame_rate
          # Abwärtskompatibilitiät v1.2 : nur über Eventnamen
          if comment == nil
            if ra == 0
              # Wert wurde von Kennzeichen mit ":" getrennt
              ra = seekerstring[seekerstring.size-$has_swpos].split(":")[1].to_i
            end
            if sw == 0
              # Sichtwinkel gabs nicht, Seeker sahen nur geradeaus (SW 1 Grad)
              sw = 1
            end
          end
          # Seek-Befehl absetzen und ins Gegenteil verkehren wenn Reverse-Schlüsselwort
          if seek2(ra, sw, i, circle) != reverse
            # Wenn in Sichtweite, den Framecount setzen falls noch nicht geschehen
            if $game_map.events[i].hk_has_seen_player_since == 0
              $game_map.events[i].hk_has_seen_player_since = Graphics.frame_count
            end
          else
             # Wenn nicht in Sichtweite, den Framecount auf 0 setzen
             $game_map.events[i].hk_has_seen_player_since = 0
          end
          # Wenn Player schon lang genug in Sichtweite ist
          if ( ( ( $game_map.events[i].hk_has_seen_player_since + rt ) <
            Graphics.frame_count ) and $game_map.events[i].hk_has_seen_player_since != 0 )
            # Starten nur wenn Event nicht läuft und nicht gelöscht ist
            unless $game_system.map_interpreter.running? or 
                   $game_map.events[i].list == nil or
                   $game_map.events[i].moving?
              $game_map.events[i].start
            end
          end
        end
      end
    end
  return true
  end
  #--------------------------------------------------------------------------
  # *  Seek2  New Seek-Method since v2.0, acts with HaS_Geometrie
  #     range  : How far the Seeker can look (Tiles)
  #     siwi   : Seighting-Triangle-Angle
  #              1-179 degrees, other values will skip Triangle-Check
  #     seeker : Seeker's Event-ID
  #     circle : Seighting-Circle with Radius range around Seeker?
  #              If Triangle and Circle are aktive, Player has to be in both
  #--------------------------------------------------------------------------
  def seek2(range, siwi, seeker, circle)
    ax = $game_map.events[seeker].real_x
    ay = $game_map.events[seeker].real_y
    px = $game_player.real_x
    py = $game_player.real_y
    blx = 0.0
    bly = 0.0
    alpha = siwi
    strecke_h = range * 128
    richtung = $game_map.events[seeker].direction
    sichtkreis = circle
    if $has_geometrie.variablen_uebergeben(ax, ay, px, py, blx, bly, alpha, strecke_h, richtung, sichtkreis)
      if $has_geometrie.spieler_in_sichtfeld #spieler ist in sichtfeld
        @hideevs.each do |id| #überprüfe ob hide event auf strecke
          blx = $game_map.events[id].real_x
          bly = $game_map.events[id].real_y
          $has_geometrie.blockpunkte_aendern(blx, bly)
          return false if $has_geometrie.hide_auf_strecke
        end
        @terrains.each do |terrain| #überprüfe ob terrain event auf strecke
          blx = terrain["x"] * 128
          bly = terrain["y"] * 128
          $has_geometrie.blockpunkte_aendern(blx, bly)
          return false if $has_geometrie.hide_auf_strecke
        end
        return true
      end
    end
    return false
  end
end
 
#==============================================================================
# ** Interpreter
#------------------------------------------------------------------------------
#  For direct Commands to Hide and Seek and old methods (compatibility)
#==============================================================================
class Interpreter
  #--------------------------------------------------------------------------
  # *  HaS Seek  Manual seek for Conditional Branch. 
  #     siwi   : Angle
  #     sw     : Seighting-Distance      
  #     circle : Circle on or off
  #     rt     : Reaction Time
  #     seek_id: Id of the seeking Event                            
  #--------------------------------------------------------------------------
  def has_seek(siwi, sw, circle = false, rt = 0, seek_id = @event_id )
    if $hide_and_seek != nil
      if $hide_and_seek.seek2(sw,siwi,seek_id,circle)
        if $game_map.events[@event_id].hk_has_seen_player_since == 0
          $game_map.events[@event_id].hk_has_seen_player_since = Graphics.frame_count
        end
        if ( ( ( $game_map.events[@event_id].hk_has_seen_player_since + rt ) <
          Graphics.frame_count ) and $game_map.events[@event_id].hk_has_seen_player_since != 0 )
          return true
        end
      else
        $game_map.events[@event_id].hk_has_seen_player_since = 0
      end
    end
    return false
  end
  #--------------------------------------------------------------------------
  # *  HaS Seconds Player Seen  Returns how many seconds the Player is seen
  #                             by the Event with the ID.
  #     eventid: ID of the Seeker (optional)
  #--------------------------------------------------------------------------
  def has_seconds_player_seen(eventid = @event_id)
    if $game_map.events[eventid].hk_has_seen_player_since == 0
      spt = 0
    else
      spt = Graphics.frame_count - $game_map.events[eventid].hk_has_seen_player_since
      spt = (spt / Graphics.frame_rate).round
    end
    return spt
  end
  #--------------------------------------------------------------------------
  # *  HaS Set Seconds Player Seen  Sets the Player-Seen-Seconds to a value.
  #     seconds: Seconds (optional)
  #     eventid: ID of the Seeker (optional)
  #--------------------------------------------------------------------------
  def has_set_seconds_player_seen(seconds = 0, eventid = @event_id)
    $game_map.events[eventid].hk_has_seen_player_since = seconds * Graphics.frame_rate
    return true
  end
  #--------------------------------------------------------------------------
  # *  Set Hide and Seek Event  Name of old Method (v1.3), 
  # *                           use is not recommed.
  #--------------------------------------------------------------------------
  def set_hideandseek_event(eventid, seek, hide)
    if $hide_and_seek != nil 
      $hide_and_seek.change_unit(eventid, seek, hide)
    end
    return true
  end
  #--------------------------------------------------------------------------
  # *  Seek  Name of the old Seek-Method which was declared at Interpreter Class
  #     sw      : Range
  #     sb      : no use anymore (was event id of the first hideevent)
  #     ab      : no use anymore (was event id of the last hideevent)
  #     seek_id : Seeker's Event-ID
  #--------------------------------------------------------------------------
  def seek(sw, sb = 0, ab = 0, seek_id = @event_id)
    if $hide_and_seek != nil
      return $hide_and_seek.seek2(sw, 1, seek_id, false)
    end
    return false
  end
end
 
#==============================================================================
# ** HaS_Geometrie
#------------------------------------------------------------------------------
#  This Class does the geometrics for Hide and Seek
#  If you extract anything from this class (even if you just get
#  "inspiration"), I want to be credited! Sorry but this was pretty much work.
#==============================================================================
class HaS_Geometrie
  #--------------------------------------------------------------------------
  # * Variablen Übergeben  Setting instance Variables for the calculations
  #     ax, ay     : Event X and Event Y Coordinates
  #     px, py     : Player X and Player Y Coordinates
  #     blx, bly   : Hideevent X and Hideevent Y Coordinates
  #     alpha      : Seighting-Triangle Angle
  #     sichtweite : Seighting-Distance
  #     kreis      : True if a Seighting-Circle shout be calculated
  #--------------------------------------------------------------------------
  def variablen_uebergeben(ax, ay, px, py, blx, bly, alpha, sichtweite, richtung, kreis)
    @punkt_a = { "x" => ax, "y" => ay}
    @punkt_b = { "x" => 0.0, "y" => 0.0}
    @punkt_c = { "x" => 0.0, "y" => 0.0}
    @punkt_p = { "x" => px, "y" => py}
    @punkt_bl = { "x" => blx, "y" => bly}
    @richtung = richtung
    @sichtweite = sichtweite
    @sichtwinkel = alpha
    @circle = kreis
    return true if eckpunkte_bestimmen
  end
  #--------------------------------------------------------------------------
  # * Blockpunkte Ändern  Method to change Hideevent-Coordinates
  #     blx, bly   : Hideevent X and Hideevent Y Coordinates
  #--------------------------------------------------------------------------
  def blockpunkte_aendern(blx, bly)
    @punkt_bl = { "x" => blx, "y" => bly}
  end
  #--------------------------------------------------------------------------
  # * Bogenmass  Thanks to =Kai= and Monsta from rpg-studio for this Method
  #     n : Angle
  #--------------------------------------------------------------------------
  def bogenmass(n)
     n * 2.0 * Math::PI / 360.0
  end
  #--------------------------------------------------------------------------
  # * Eckpunkte Bestimmen  Figures out Verticles of the Seighting-Triangle
  #     Thanks to =Kai= for eliminating some syntax errors with Math.sin
  #--------------------------------------------------------------------------
  def eckpunkte_bestimmen
    alpha = @sichtwinkel
    strecke_h = @sichtweite
    gamma = (180.0 - alpha) / 2.0
    gamma_b = bogenmass(gamma)
    alpha_b = bogenmass(alpha)
    a = ((strecke_h/Math.sin(gamma_b)) * (Math.sin(alpha_b/2.0))) * 2.0
    case @richtung
    when 2
      @punkt_b["y"] = @punkt_a["y"]+strecke_h
      @punkt_c["y"] = @punkt_a["y"]+strecke_h
      @punkt_b["x"] = @punkt_a["x"]+(a/2.0)
      @punkt_c["x"] = @punkt_a["x"]-(a/2.0)  
    when 4
      @punkt_b["x"] = @punkt_a["x"]-strecke_h
      @punkt_c["x"] = @punkt_a["x"]-strecke_h
      @punkt_b["y"] = @punkt_a["y"]-(a/2.0)
      @punkt_c["y"] = @punkt_a["y"]+(a/2.0)
    when 6
      @punkt_b["x"] = @punkt_a["x"]+strecke_h
      @punkt_c["x"] = @punkt_a["x"]+strecke_h
      @punkt_b["y"] = @punkt_a["y"]+(a/2.0)
      @punkt_c["y"] = @punkt_a["y"]-(a/2.0)
    when 8
      @punkt_b["y"] = @punkt_a["y"]-strecke_h
      @punkt_c["y"] = @punkt_a["y"]-strecke_h
      @punkt_b["x"] = @punkt_a["x"]-(a/2.0)
      @punkt_c["x"] = @punkt_a["x"]+(a/2.0)  
    end
    return true
  end
  #--------------------------------------------------------------------------
  # * Spieler in Sichtfeld  Returns True if Player is within 
  #     Seighting-Triangle (if it is activated) and Seighting-Circle 
  #     (if it is activated), or if Player is on Seek-Event
  #--------------------------------------------------------------------------
  def spieler_in_sichtfeld
 
    # Punkte zur Berechnung setzen (P ist Spieler, A Seeker)
    px = @punkt_p["x"]
    py = @punkt_p["y"]
    ax = @punkt_a["x"]
    ay = @punkt_a["y"]
    bx = @punkt_b["x"]
    by = @punkt_b["y"]
    cx = @punkt_c["x"]
    cy = @punkt_c["y"]
 
    # Wenn Spieler auf selber Position wie Seeker steht: True
    return true if px == ax && py == ay
 
    # Wenn weder Sichtkreis noch Sichtdreieck aktiviert sind, hier abbrechen
    if not @circle and not @sichtwinkel.between?(1,179)
      return false
    end
 
    # Sichtkreis:
    # Prüfung ob Spieler innerhalb eines Kreises mit Radius Sichtweite ist
    if @circle
      # Muss nur geprüft werden wenn es eingestellt wurde
      return false if (((px - ax).abs + (py - ay).abs) > @sichtweite )
    end
 
    # Sichtdreieck:
    # Prüfung ob Spieler außerhalb der Sichtweite oder hinter dem Seeker ist
    unless @sichtwinkel.between?(1,179)
      # Wenn ein Sichtwinkel von 0 oder 360 eingestellt wurde: Prüfung überspringen
      # Dann wird nur die Auswertung vom Sichtkreis genommen
      return true
    end
    case @richtung
    when 2
      return false if py > by || py < ay  # by == cy
    when 4
      return false if px > ax || px < bx  # bx == cx
    when 6
      return false if px < ax || px > bx  # bx == cx
    when 8
      return false if py < by || py > ay  # by == cy
    end
    ab_m = 1.0
    ab_b = 1.0
    ac_m = 1.0
    ac_b = 1.0
    #gerade AB
    ab_m = (by - ay) / (bx - ax)
    ab_b = ay - (ab_m * ax)
    #gerade AC
    ac_m = (cy - ay) / (cx - ax)
    ac_b = ay - (ac_m * ax)
    #aufgelöst nach x und y :
    #py == (m*px) + b
    #px == (py - b) / m
    #Eingesetzte für X-Wert der Strecke AB, 
    ab_x = (py - ab_b) / ab_m
    ab_y = (ab_m*px) + ab_b
    ac_x = (py - ac_b) / ac_m
    ac_y = (ac_m*px) + ac_b
    case @richtung
    when 2
      return false if px <= ac_x || px >= ab_x
    when 4
      return false if py >= ac_y || py <= ab_y
    when 6
      return false if py <= ac_y || py >= ab_y
    when 8
      return false if px >= ac_x || px <= ab_x
    end
 
    return true
  end
  #--------------------------------------------------------------------------
  # * Hide auf Strecke  Returns True if Hideevent is between Player and Seeker
  #     Thanks to uni-protokolle.de for some inspiration, they could not
  #     explain what I wanted to know, but somehow I figuerd it out by myself
  #--------------------------------------------------------------------------
  def hide_auf_strecke
 
    # Punkte zur Berechnung übernehmen (P ist Spieler, A Seeker und BL Hide)
    px = @punkt_p["x"]
    py = @punkt_p["y"]
    ax = @punkt_a["x"]
    ay = @punkt_a["y"]
    blx = @punkt_bl["x"]
    bly = @punkt_bl["y"]
 
    # Wenn Seeker selbst Hideevent, nicht prüfen  
    return false if @punkt_bl == @punkt_a 
 
    case @richtung # ist Hide-Event irgendwo zwischen Spieler und Seeker
    when 2
      return false if bly > py || bly < ay
    when 4
      return false if blx > ax || blx < px
    when 6
      return false if blx < ax || blx > px
    when 8
      return false if bly < py || bly > ay
    end
    # Temporäre Variablen deklarieren, vorhandene zu Dezimalzahlen umwandeln
    px *= 1.0
    py *= 1.0
    ax *= 1.0
    ay *= 1.0
    blx *= 1.0
    bly *= 1.0
    m = -1.0
    b = -1.0
    tempx = -1.0
    tempy = -1.0
    qx = []
    qy = []
    # Das Blockevent wird zu einem Quadrat gemacht; die 4 Punkte berechnen:
    qx[1] = blx - 64.0
    qy[1] = bly - 64.0
    qx[2] = blx + 64.0
    qy[2] = bly - 64.0
    qx[3] = blx - 64.0
    qy[3] = bly + 64.0
    qx[4] = blx + 64.0
    qy[4] = bly + 64.0
    # Funktionsgleichung für eine Gerade zwischen Seeker und Spieler aufstellen
    # Steigung M berechnen
    if ((px - ax) == 0) # Steigung endlos
      m = 9999999.99
    else
      m = (py - ay) / (px - ax)
    end 
    # Y-Achsenabschnittszahl B berechnen
    b = ay - (m * ax)
    # Jetzt nur noch prüfen, ob die Gerade eine der Kanten des Quadrates schneidet
    tempx = funktionsgleichung_auswerten(qy[1], 0, m, b)
    return true if tempx >= qx[1] && tempx <= qx[2]
    tempx = funktionsgleichung_auswerten(qy[3], 0, m, b)
    return true if tempx >= qx[3] && tempx <= qx[4]
    tempy = funktionsgleichung_auswerten(0, qx[1], m, b)
    return true if tempy >= qy[1] && tempy <= qy[3]  
    tempy = funktionsgleichung_auswerten(0, qx[2], m, b)
    return true if tempy >= qy[2] && tempy <= qy[4]   
    # Wenn Gerade nicht das Quadrat schneitet, false
    return false
  end
  #--------------------------------------------------------------------------
  # * Funktionsgleichung Auswerten  Returns X or Y ( y = m * x + b )
  #--------------------------------------------------------------------------
  def funktionsgleichung_auswerten(y, x, m, b)
    if y == 0
      # nach y auflösen
      return (m * x + b)
    elsif x == 0
      # nach x auflösen
      return ((y -  b) / m)
    else
      return 0
    end
  end
end
zum Lesen den Text mit der Maus markieren


Beide Scripte meckern bei $game_map.map.events[@id].name bzw $game_map.map.events[ev.id].name und ich hab keine Ahnung, wie ich das in Ordnung bringen sollte :<

Ansonsten funktioniert es gut und macht genau das, was ich dringend brauche :D (ich müsste sonst nämlich einen Haufen leere Events auf der Map zur Verfügung stellen, was es nur wieder komplizierter macht XD)

Aber da wäre noch die Frage:
Kann man Events auch wieder komplett löschen? Ist das möglich? Ich meine damit nicht "Erase-Event", sondern wirklich löschen? Dabei muss sich nichts vom Script gemerkt werden, die ID neu geclonter Events speichere ich sowieso in einer Variable, damit ich darauf zugreifen kann (mit dieser Variable kann ich dann die Event-ID rausziehen, die gelöscht werden soll). Wenn es nicht möglich sein sollte, habe ich zwar schon eine Notlösung parat (eine extra Variable, die sich nicht mehr benutzte Event-IDs für den wiederverbrauch merkt), aber das ist unglaublich kompliziert, dann immer rauszusuchen, welches Event denn jetzt gerade nicht benutzt wird, sonst habe ich am Ende irgendwann 2000 Events auf der Map herumkullern :3
Im Orginal-Threadt steht, dass man den "Event-Leichen"-Threadt mit einbezogen hätte, aber im Script selbst gibt es keine Anweisungen und dann heißt es an anderer Stelle ".delete" würde zu Fehlern führen und jetzt bin ich verunsichert XD
Jedenfalls wenn ich einfach mal "$game_map.events.delete(4)" wird Event 4 nicht gelöscht XD


Ich bin froh über jede Form von Hilfe! :D
(Angehangen ein Testprojekt, dort drin sind alle 4 Scripts enthalten :3 Aluxes teleportiert random Basil-Klone XD)
»Josey« hat folgende Datei angehängt:
  • Klonen-Test.rar (191,87 kB - 1 mal heruntergeladen - zuletzt: 5. Februar 2017, 03:17)
Notfalldiscord: Hier klicken


  • Joseys Wuselei

    • Meine Story - Pausiert
      Lust auf Abenteuer?
      So richtig mit Selbstbestimmung?
      Und mit was Spannendem? Zum Spielen? Ohne Schokolade?
      "Eines, das mit dem leistungsstärksten Grafikchip der Welt läuft? Deiner Vorstellungskraft?"
      Hier die Antwort:
      Bild
      Bild
      Hier könnt ihr euren Lieblingschar wählen ;D
      Und hier findet ihr das Minigame, das ab und an den Würfel ersetzt.
    • Meine Arbeiten
      Einige Ressourcen, vor allem Baby-Tiere, aber auch alle Requests, die ich erfüllt habe.
      Bild

      Bild

      In unregelmäßigen Abständen fasse ich alles Neue, was so im Studio passiert ist, zusammen. -Pausiert-
      Bild
    • Meine Fähigkeiten
      Maker: :rmxp: XP
      :rainbow: Pixeln: :star: :star: :star: :star: :star-empty: :star-empty:
      :image: Mappen: :star: :star: :star: :star: :star: :star-empty:
      :wrench-screwdriver: Eventen: :star: :star: :star: :star: :star-empty: :star-empty:
      :puzzle: Scripten: :star: :star-half: :star-empty: :star-empty: :star-empty: :star-empty:
      :music: Komponieren: :star-half: :star-empty: :star-empty: :star-empty: :star-empty: :star-empty:
    • (Mein) Autismus
      Ich bin im autistischen Sprektrum-
      sollte ich mich komisch verhalten, oder unhöflich wirken
      (oder mich zu oft entschuldigen, unaufmerksam sein, unsicher wirken, zum zehnten Mal nachfragen, blablabla),
      ist das nicht beabsichtigt.


      Josey. Epicgarantie.
      Nehmt das bloß nicht ernst! D:
    • Meine Welt
      Mein Ehemann Kain! :heart_full: :*
      Freund und Helfer in der Not, immer da, steht er mir mit Rat und Tat zur Seite. Meine andere Hälfte! : D
      Er verdient einfach einen Platz ( :medal: ) in meiner Signatur! XD
      :heart-half:
    • Mein Support
      Der In-Game-Charset-Generator!
      Erstelle Random-NPCs mit Charsetteilen!

      Diese Spiele finde ich toll und brauchen viel mehr Aufmerksamkeit!
      Bastelt mal Banner! : D

    • Meine beendeten Contests
      [Pixelcontest] Rund um den Kürbis
      Bild
      Abstimmung
      Siegerehrung

      Das Wunder der Berge
      Bild
      Abstimmung
      Siegerehrung
    • Meine Contests
      Bild Ein Schreibcontest in Arbeit! : D Bild
  • Joseys Spiele

    • Endless Ending
      :rmxp: Endless Ending
      (Arbeitstitel, "ernstes Projekt")

      Bild

      Eine Reise durch die Wüste.
      Sieben mächtige Gegenstände.
      Unendlich viele Aufgaben.

      Und die Götter haben die Würfel.
    • Scripted Desaster
      :rmxp: Scripted Desaster
      ("nicht ganz so ernstes Projekt")

      Ein verfressener Idiot und ein sarkastischer Workaholic treffen in einem dunklen Wald auf einen weißes Kaninchen...
      Ein Auftragskiller jagt einem Meisterdieb hinterher, wobei nicht ersichtlich ist, wer eigentlich wen jagt...
      Und eine "Kristallhöhle", sowie einen "Wald ohne Wiederkehr" gibts auch.

      Das bedeutet doch Spaß...
    • Pokémon EV
      :rmxp: Pokemon EV
      ("Zeitvertreib nebenbei - Kreatief-Helfer")

      Ist nur ein Pokemonspiel mit üblicher Story und nicht so üblicher Story.
      Ist inzwischen alles schonmal dagewesen. XD
    • Lost Island
      :rmxp: Harvest Moon - Lost Island
      (Arbeitstitel, "Eventtechnik-Projekt")

      Ist momentan mein Hauptprojekt, weil bei EE die Scripts einfach fehlen :<
      Das Spiel ist ein Harvest Moon Abklatsch. XD
      Felder funktionieren, Tiere auch, Grafiken sehen schon gut aus, Maps sind fast fertig. Man kann in die Miene, man kann einkaufen. Auf dem Papier ist alles schon durchgeplant, einiges muss noch umgesetzt werden.
  • Joseys Fortschritt

    • Endless Ending
      :hourglass: Story: 60%
      :foaf: Charas: 20%
      :leaf: Maps: 01%
      :ruby: Zeichnungen: 05%
      :color: Grafiken: 30%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      ...ist nicht viel, huh? ^^°
    • Scripted Desaster
      :hourglass: Story: 10%
      :foaf: Charas: 60%
      :leaf: Maps: 30%
      :ruby: Zeichnungen: 01%
      :color: Grafiken: 60%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      Gut Ding...
    • Pokemon EV
      :hourglass: Story: 60%
      :foaf: Charas: 10%
      :leaf: Maps: 00%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 80%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 70%
      Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht...
    • Lost Island
      :hourglass: Story: 100%
      :foaf: Charas: 10%
      :leaf: Maps: 90%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 60%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 00%
      Das macht richtig Spaß XD
  • Huiii

    Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Josey« (5. Februar 2017, 20:42)


2

Sonntag, 5. Februar 2017, 03:56

Ersetz beim Hide&Seek mal die Methode event_name ab Zeile 356 bis Zeile 360

Ruby Quellcode

356
357
358
359
360
  def event_name
    if $game_map != nil
      return $game_map.map.events[@id].name if @id != nil
    end
  end

durch die folgende Definition:

Ruby Quellcode

356
357
358
  def event_name
    @event.name if @id != nil
  end

Dann sollte es wieder gehen. Das originale Skript geht da einen seltsamen Umweg - die obige Definition tut das gleiche, setzt aber weniger voraus.

Das Flat-Script von Monsta geht auch ein paar unnötige umwege. Da würde ich einfach empfehlen das Script von Shabz zu verwenden: Event-Layer durch Namen ändern

Zum Löschen: Ich vermute, dass $game_map.events.delete das Event schon löscht, nur die Anzeige nicht aktualisiert wird. Probier mal dieses CallScript aus:

Ruby Quellcode

1
2
$game_map.events.delete(4)
$scene.spriteset.refresh

Allerdings löscht es nicht das Event aus dem von Irrlicht geschaffenen Speicher. Ich nehme an, da soll es aber auch raus, wenn Du vom "richtigen Löschen" sprichst?

Josey

Storyteller

  • »Josey« ist der Autor dieses Themas

Motto: "Was du nicht willst, das man dir tu', füge keinem And'ren zu!"

  • Nachricht senden

3

Sonntag, 5. Februar 2017, 16:05

Scheint alles so zu funktionieren, wie es soll, vielen dank Playm! :D
Shabzs Event-Layer läuft super mit meinen Scripten, das H&S funktioniert dank deines Fixes jetzt auch mit dem Klon-Event-Script und es tut, was es tun soll! :D
Nach dem .delete noch ein refresh zu machen, da hätt ich selber drauf kommen können :/

Ja, es sollte ganz aus dem Speicher von Irrlicht raus. Im Moment habe ich nämlich noch dieses Problem:
Spoiler
Wenn ich mir jedenfalls die Event-IDs rausgeben lasse, funktioniert es scheinbar. ... Ja, das deleten hat dann doch einen Haken. _._ Im ersten Moment scheint es zu klappen, ich lösche Event4 und spawne ein neues, das angeblich die 4 als ID hat. Aber nach einem Mapwechsel, ist das alte Event4 wieder da und das neue Event4 hat eine andere ID. Das ist ungünstig. :/
Kann man die Events auch dauerhaft löschen, oder ist das gar nicht möglich?
Zur Sicherheit jetzt die neue Testversion dran (ohne H&S und Flatevent), mit einem delete-Event drin. ._.
Wenns nicht geht, speichere ich eben die IDs und suche jedes Mal durch, ob ich irgendwo eine ID übrig habe XD°
zum Lesen den Text mit der Maus markieren


Edit: Funktioniert doch, wenn mans richtig macht XD
»Josey« hat folgende Datei angehängt:
  • Klonen-Test.rar (181,05 kB - 2 mal heruntergeladen - zuletzt: 29. Juli 2017, 16:45)
Notfalldiscord: Hier klicken


  • Joseys Wuselei

    • Meine Story - Pausiert
      Lust auf Abenteuer?
      So richtig mit Selbstbestimmung?
      Und mit was Spannendem? Zum Spielen? Ohne Schokolade?
      "Eines, das mit dem leistungsstärksten Grafikchip der Welt läuft? Deiner Vorstellungskraft?"
      Hier die Antwort:
      Bild
      Bild
      Hier könnt ihr euren Lieblingschar wählen ;D
      Und hier findet ihr das Minigame, das ab und an den Würfel ersetzt.
    • Meine Arbeiten
      Einige Ressourcen, vor allem Baby-Tiere, aber auch alle Requests, die ich erfüllt habe.
      Bild

      Bild

      In unregelmäßigen Abständen fasse ich alles Neue, was so im Studio passiert ist, zusammen. -Pausiert-
      Bild
    • Meine Fähigkeiten
      Maker: :rmxp: XP
      :rainbow: Pixeln: :star: :star: :star: :star: :star-empty: :star-empty:
      :image: Mappen: :star: :star: :star: :star: :star: :star-empty:
      :wrench-screwdriver: Eventen: :star: :star: :star: :star: :star-empty: :star-empty:
      :puzzle: Scripten: :star: :star-half: :star-empty: :star-empty: :star-empty: :star-empty:
      :music: Komponieren: :star-half: :star-empty: :star-empty: :star-empty: :star-empty: :star-empty:
    • (Mein) Autismus
      Ich bin im autistischen Sprektrum-
      sollte ich mich komisch verhalten, oder unhöflich wirken
      (oder mich zu oft entschuldigen, unaufmerksam sein, unsicher wirken, zum zehnten Mal nachfragen, blablabla),
      ist das nicht beabsichtigt.


      Josey. Epicgarantie.
      Nehmt das bloß nicht ernst! D:
    • Meine Welt
      Mein Ehemann Kain! :heart_full: :*
      Freund und Helfer in der Not, immer da, steht er mir mit Rat und Tat zur Seite. Meine andere Hälfte! : D
      Er verdient einfach einen Platz ( :medal: ) in meiner Signatur! XD
      :heart-half:
    • Mein Support
      Der In-Game-Charset-Generator!
      Erstelle Random-NPCs mit Charsetteilen!

      Diese Spiele finde ich toll und brauchen viel mehr Aufmerksamkeit!
      Bastelt mal Banner! : D

    • Meine beendeten Contests
      [Pixelcontest] Rund um den Kürbis
      Bild
      Abstimmung
      Siegerehrung

      Das Wunder der Berge
      Bild
      Abstimmung
      Siegerehrung
    • Meine Contests
      Bild Ein Schreibcontest in Arbeit! : D Bild
  • Joseys Spiele

    • Endless Ending
      :rmxp: Endless Ending
      (Arbeitstitel, "ernstes Projekt")

      Bild

      Eine Reise durch die Wüste.
      Sieben mächtige Gegenstände.
      Unendlich viele Aufgaben.

      Und die Götter haben die Würfel.
    • Scripted Desaster
      :rmxp: Scripted Desaster
      ("nicht ganz so ernstes Projekt")

      Ein verfressener Idiot und ein sarkastischer Workaholic treffen in einem dunklen Wald auf einen weißes Kaninchen...
      Ein Auftragskiller jagt einem Meisterdieb hinterher, wobei nicht ersichtlich ist, wer eigentlich wen jagt...
      Und eine "Kristallhöhle", sowie einen "Wald ohne Wiederkehr" gibts auch.

      Das bedeutet doch Spaß...
    • Pokémon EV
      :rmxp: Pokemon EV
      ("Zeitvertreib nebenbei - Kreatief-Helfer")

      Ist nur ein Pokemonspiel mit üblicher Story und nicht so üblicher Story.
      Ist inzwischen alles schonmal dagewesen. XD
    • Lost Island
      :rmxp: Harvest Moon - Lost Island
      (Arbeitstitel, "Eventtechnik-Projekt")

      Ist momentan mein Hauptprojekt, weil bei EE die Scripts einfach fehlen :<
      Das Spiel ist ein Harvest Moon Abklatsch. XD
      Felder funktionieren, Tiere auch, Grafiken sehen schon gut aus, Maps sind fast fertig. Man kann in die Miene, man kann einkaufen. Auf dem Papier ist alles schon durchgeplant, einiges muss noch umgesetzt werden.
  • Joseys Fortschritt

    • Endless Ending
      :hourglass: Story: 60%
      :foaf: Charas: 20%
      :leaf: Maps: 01%
      :ruby: Zeichnungen: 05%
      :color: Grafiken: 30%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      ...ist nicht viel, huh? ^^°
    • Scripted Desaster
      :hourglass: Story: 10%
      :foaf: Charas: 60%
      :leaf: Maps: 30%
      :ruby: Zeichnungen: 01%
      :color: Grafiken: 60%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      Gut Ding...
    • Pokemon EV
      :hourglass: Story: 60%
      :foaf: Charas: 10%
      :leaf: Maps: 00%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 80%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 70%
      Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht...
    • Lost Island
      :hourglass: Story: 100%
      :foaf: Charas: 10%
      :leaf: Maps: 90%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 60%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 00%
      Das macht richtig Spaß XD
  • Huiii

    Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Josey« (5. Februar 2017, 15:56)


4

Sonntag, 5. Februar 2017, 16:11

Spoiler: Hat sich erledigt
Bei mir funktioniert das zurückgeben der neuen ID problemlos. Speicher den Rückgabewert mal in einer anders benannten Variable wie "i" oder "k" - ich glaube, wenn Du "id" printest, ist die Variable schon wieder neu definiert.

Zum Beispiel das hier klappt bei mir:

Ruby Quellcode

1
2
3
4
5
6
7
x = $game_variables[1]
y = $game_variables[2]
i = $game_map.add_event(
2,1,x,y,true)
$scene.spriteset.refresh
 
print "Die EventID lautet: " + i.to_s
zum Lesen den Text mit der Maus markieren


Zu dem Problem mit dem speichern von Events: Das System, wie Irrlicht es gebaut hat, sieht es nicht vor die Events wieder zu entfernen. Die Frage wäre, wie man zwei hinzugefügte Events unterscheidet. Vielleicht müsste man das ganze System nochmal überdenken. :hm:

Josey

Storyteller

  • »Josey« ist der Autor dieses Themas

Motto: "Was du nicht willst, das man dir tu', füge keinem And'ren zu!"

  • Nachricht senden

5

Sonntag, 5. Februar 2017, 19:17

Zitat

Hat sich erledigt

Sorry :P
Ich hatte es tatsächlich nur falsch benutzt, das habe ich nach dem Schreiben, beim weiteren frustrierten herumprobieren bemerkt.

Zitat

Zu dem Problem mit dem speichern von Events: Das System, wie Irrlicht es gebaut hat, sieht es nicht vor die Events wieder zu entfernen. Die Frage wäre, wie man zwei hinzugefügte Events unterscheidet. Vielleicht müsste man das ganze System nochmal überdenken. :hm:

Zwei hinzugefügte Events könnte man bis zu 5000 Stück durchaus über selbst eingebaute Variablen unterscheiden. Diese intern ins Script direkt einzubauen, dürfte auch möglich sein, geht aber auch über mein Script.
Dort benutze ich keine Zahlen, sondern Platzhalter (zB event_variables[klon_id] = XX), die je nach Durchgang durch ein anderes Script vorher festgelegt wurden :/ Aber ich weiß nicht, ob das so funktioniert. Wenn man die gar nicht richtig löschen kann, bleibt mir nichts anderes übrig, als ein System zu basteln, dass eine Art Archiv für mich durchsucht, ob irgendeine "Archiv_Variable" eine ID gespeichert hat, die ich nochmal verwenden kann ._.

Danke Playm, zumindest funktioniert das System jetzt mit meinen Scripten :D
Notfalldiscord: Hier klicken


  • Joseys Wuselei

    • Meine Story - Pausiert
      Lust auf Abenteuer?
      So richtig mit Selbstbestimmung?
      Und mit was Spannendem? Zum Spielen? Ohne Schokolade?
      "Eines, das mit dem leistungsstärksten Grafikchip der Welt läuft? Deiner Vorstellungskraft?"
      Hier die Antwort:
      Bild
      Bild
      Hier könnt ihr euren Lieblingschar wählen ;D
      Und hier findet ihr das Minigame, das ab und an den Würfel ersetzt.
    • Meine Arbeiten
      Einige Ressourcen, vor allem Baby-Tiere, aber auch alle Requests, die ich erfüllt habe.
      Bild

      Bild

      In unregelmäßigen Abständen fasse ich alles Neue, was so im Studio passiert ist, zusammen. -Pausiert-
      Bild
    • Meine Fähigkeiten
      Maker: :rmxp: XP
      :rainbow: Pixeln: :star: :star: :star: :star: :star-empty: :star-empty:
      :image: Mappen: :star: :star: :star: :star: :star: :star-empty:
      :wrench-screwdriver: Eventen: :star: :star: :star: :star: :star-empty: :star-empty:
      :puzzle: Scripten: :star: :star-half: :star-empty: :star-empty: :star-empty: :star-empty:
      :music: Komponieren: :star-half: :star-empty: :star-empty: :star-empty: :star-empty: :star-empty:
    • (Mein) Autismus
      Ich bin im autistischen Sprektrum-
      sollte ich mich komisch verhalten, oder unhöflich wirken
      (oder mich zu oft entschuldigen, unaufmerksam sein, unsicher wirken, zum zehnten Mal nachfragen, blablabla),
      ist das nicht beabsichtigt.


      Josey. Epicgarantie.
      Nehmt das bloß nicht ernst! D:
    • Meine Welt
      Mein Ehemann Kain! :heart_full: :*
      Freund und Helfer in der Not, immer da, steht er mir mit Rat und Tat zur Seite. Meine andere Hälfte! : D
      Er verdient einfach einen Platz ( :medal: ) in meiner Signatur! XD
      :heart-half:
    • Mein Support
      Der In-Game-Charset-Generator!
      Erstelle Random-NPCs mit Charsetteilen!

      Diese Spiele finde ich toll und brauchen viel mehr Aufmerksamkeit!
      Bastelt mal Banner! : D

    • Meine beendeten Contests
      [Pixelcontest] Rund um den Kürbis
      Bild
      Abstimmung
      Siegerehrung

      Das Wunder der Berge
      Bild
      Abstimmung
      Siegerehrung
    • Meine Contests
      Bild Ein Schreibcontest in Arbeit! : D Bild
  • Joseys Spiele

    • Endless Ending
      :rmxp: Endless Ending
      (Arbeitstitel, "ernstes Projekt")

      Bild

      Eine Reise durch die Wüste.
      Sieben mächtige Gegenstände.
      Unendlich viele Aufgaben.

      Und die Götter haben die Würfel.
    • Scripted Desaster
      :rmxp: Scripted Desaster
      ("nicht ganz so ernstes Projekt")

      Ein verfressener Idiot und ein sarkastischer Workaholic treffen in einem dunklen Wald auf einen weißes Kaninchen...
      Ein Auftragskiller jagt einem Meisterdieb hinterher, wobei nicht ersichtlich ist, wer eigentlich wen jagt...
      Und eine "Kristallhöhle", sowie einen "Wald ohne Wiederkehr" gibts auch.

      Das bedeutet doch Spaß...
    • Pokémon EV
      :rmxp: Pokemon EV
      ("Zeitvertreib nebenbei - Kreatief-Helfer")

      Ist nur ein Pokemonspiel mit üblicher Story und nicht so üblicher Story.
      Ist inzwischen alles schonmal dagewesen. XD
    • Lost Island
      :rmxp: Harvest Moon - Lost Island
      (Arbeitstitel, "Eventtechnik-Projekt")

      Ist momentan mein Hauptprojekt, weil bei EE die Scripts einfach fehlen :<
      Das Spiel ist ein Harvest Moon Abklatsch. XD
      Felder funktionieren, Tiere auch, Grafiken sehen schon gut aus, Maps sind fast fertig. Man kann in die Miene, man kann einkaufen. Auf dem Papier ist alles schon durchgeplant, einiges muss noch umgesetzt werden.
  • Joseys Fortschritt

    • Endless Ending
      :hourglass: Story: 60%
      :foaf: Charas: 20%
      :leaf: Maps: 01%
      :ruby: Zeichnungen: 05%
      :color: Grafiken: 30%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      ...ist nicht viel, huh? ^^°
    • Scripted Desaster
      :hourglass: Story: 10%
      :foaf: Charas: 60%
      :leaf: Maps: 30%
      :ruby: Zeichnungen: 01%
      :color: Grafiken: 60%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      Gut Ding...
    • Pokemon EV
      :hourglass: Story: 60%
      :foaf: Charas: 10%
      :leaf: Maps: 00%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 80%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 70%
      Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht...
    • Lost Island
      :hourglass: Story: 100%
      :foaf: Charas: 10%
      :leaf: Maps: 90%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 60%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 00%
      Das macht richtig Spaß XD
  • Huiii

    Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.