You are not logged in.

  • Login
Bitte besucht unser neues Forum unter https://forum.nitrado.net | Please visit our new Forum at https://forum.nitrado.net

BtoBastian

Moderator

  • "BtoBastian" is male
  • "BtoBastian" started this thread

Posts: 3,612

Occupation: Softwareentwickler

  • Send private message

1

Monday, September 30th 2013, 2:38pm

Event das beim "kaputtgehen" eines Blocks gefeuert wird.

Hi, ich arbeite gerade an einem Sicherungsplugin (like LWC) und stehe dort vor einem kleinen Problem.
Ich will, dass wenn ein Block zerstört wird auch die Sicherung verschwindet.
Logischerweise verwende ich da das BlockBreakEvent.
Das wird aber nur gefeuert, wenn ein Spieler einen Block zerstört.
Ich muss aber auch herausfinden, wenn z.B. eine Tür kaputt geht, indem man den Block unter ihr zerstört.
Natürlich könnte ich prüfen, ob nun drüber eine Tür steht. Aber da gibt es noch so viel mehr.
Wenn ein Piston den Block drunter wegschiebt, ...
Das würde ewig dauern alle Szenarien durch zu gehen. Und dann kommen noch Schalter, Hebel, ...

Nach einiger Zeit bin ich auf das BlockPhysicsEvent gestoßen, allerdings habe ich keine Ahnung wann das nun immer gefeuert wird.
Habe ein bisschen damit rumgetestet, aber das scheint in 1000senden Szenarien gefeuert zu werden.
Wenn Wasser fließt, wenn man Block baut, abbaut, Redstone benutzt wird, ...
Solange ich nicht weiß wann es aufgerufen wird, und wie man nun rausfindet, ob ein Block zerstört wurde, müsste ich aber erstmal rausfinden, wann es gefeuert wird.
So halbwegs funktioniert zwar diese Variante, aber irg wie ist die auch nicht die wahre, da ich keine Ahnung habe, warum die überhaupt funktioniert:

Java source code

1
2
3
4
5
6
7
8
@EventHandler
public void onBlockPhysics(BlockPhysicsEvent event){
	if(event.getBlock().getType() != event.getChangedType()){
		if(event.getBlock().getType() == Material.WOODEN_DOOR){
			// Block wurde zerstört
		}
	}
}
Standard Standart eines Flamingos ist einbeinig.

BlazeMania

User / Kunde

  • "BlazeMania" is male

Posts: 1,299

Location: Berlin

Occupation: Schüler (Gymnasium)

  • Send private message

2

Monday, September 30th 2013, 2:42pm

@BtoBastian:
Guck dir mal alle Events von org.bukkit.event.block.* durch ;) Da findest du sicher das richtige :)
http://jd.bukkit.org/rb/apidocs/org/bukk…ge-summary.html

Ich würde auf das BlockFadeEvent tippen ;) (Called when a block fades, melts or disappears based on world conditions)

MfG David

BtoBastian

Moderator

  • "BtoBastian" is male
  • "BtoBastian" started this thread

Posts: 3,612

Occupation: Softwareentwickler

  • Send private message

3

Monday, September 30th 2013, 2:46pm

Hab ich schon alles angeschaut und auch vieles probiert. Das BlockFade wird dort nicht gefeuert. Ich glaube ich hab schon des richtige Event. Wenn ich es cancell wird das zerstören des Blocks auch u terbrochen (er schwebt einfach in der Luft). Aber ich weiß nicht wie ichs verwenden soll. Bukkit hält sich da in seinen JavaDocs ziemlich zurück.
Standard Standart eines Flamingos ist einbeinig.

BlazeMania

User / Kunde

  • "BlazeMania" is male

Posts: 1,299

Location: Berlin

Occupation: Schüler (Gymnasium)

  • Send private message

4

Monday, September 30th 2013, 3:05pm

@BtoBastian
Ich würde dann vielleicht dieses hier nehmen: http://jd.bukkit.org/rb/apidocs/org/bukk…romToEvent.html
Das wird gefeuert, sobald der Quellblock entfernt wird. (Also wenn du den Block unter der Tür wegmachst)

Das BlockPhysicsEvent wird glaube ich nur gefeuert, sobald ein Block runterfällt (Sand,roter Sand, Gravel etc...)

Stuppsman

User / Kunde

Posts: 2,766

Thanks: 25

  • Send private message

5

Monday, September 30th 2013, 3:36pm

Ich erklär mir das so, dass das Event tatsächlich jedesmal gefeuert wird, wenn irgendetwas passiert, was einen Block ob für kurz oder lang aufgrund von äußeren Einflussen verändert. Müsstest bei deinem Code mal austesten, ob auch das einfache Tür-Öffnen gecancelt wird.

Könntest aber auch einfach beim Startup überprüfen, ob der Block noch vom Typ ist, den du gespeichert hattest und ihn gegebenenfalls aus der Datenbank löschen, wenn nicht..

Müsst aber so doch eigentlich funktionieren mit dem Physics-Event. Müsstest noch überprüfen, ob der Block tatsächlich kaputt gegangen ist, durch event.getChangedType() == Material.AIR oder null oder so.. aber ich denk, das sollt dann laufen.
Nein, ich hab kein Skype.. bei Interesse an einer privaten Unterrichtsstunde, wende dich bitte direkt an mein Team! 8)

BtoBastian

Moderator

  • "BtoBastian" is male
  • "BtoBastian" started this thread

Posts: 3,612

Occupation: Softwareentwickler

  • Send private message

6

Monday, September 30th 2013, 4:00pm

Ok, danke, ich schau mal.
Ich vermute, dass das Event auch gefeuert wird, wenn man Türen schließt/öffnet oder was auch immer.
Werds morgen mal austesten.
Standard Standart eines Flamingos ist einbeinig.

BtoBastian

Moderator

  • "BtoBastian" is male
  • "BtoBastian" started this thread

Posts: 3,612

Occupation: Softwareentwickler

  • Send private message

7

Wednesday, October 2nd 2013, 1:45pm

PUSH

Problem:
Event wird auch gefeuert, wenn die Tür z.B. durch Redstone gefeuert wird.
Meine Vermutung zu dem Event:
Es wird immer gefeuert, wenn ein ein Block eine Aktion bei einem Block auslöst.
Also event.getBlock() ist der Block, der betroffen ist und event.getChangedType() die Art des Blocks, der die Aktion ausgelöst hat.
Komischerweise gibt es aber keine Methode getChangedBlock().
Standard Standart eines Flamingos ist einbeinig.

Stuppsman

User / Kunde

Posts: 2,766

Thanks: 25

  • Send private message

8

Wednesday, October 2nd 2013, 10:22pm

Ich denke, der ChangedType ist nicht der Block, der die Veränderung auslöst, sondern die Konsequenz daraus. (Aber das müsstest du mal austesten, was genau zurückgegeben wird)- Müsste also, nach meiner Theorie, wieder die Tür zurückgeben bei dem Redstone-Event, nur mit ner anderen Ausrichtung / Datawert (kein Plan, wie/wo gespeichert ist, ob die Tür offen oder geschlossen ist, auch egal). Du willst ja nur wissen, ob der Block danach kaputt ist. Da sollt doch reichen, wenn du überprüfst, ob nach dem Event, also der ChangedType Material.AIR (oder null, müsst man auch ausprobieren) ist, oder willst du noch mehr? Denn dann schließt du aus, dass ne Tür nur aufgegangen ist...
Nein, ich hab kein Skype.. bei Interesse an einer privaten Unterrichtsstunde, wende dich bitte direkt an mein Team! 8)

BtoBastian

Moderator

  • "BtoBastian" is male
  • "BtoBastian" started this thread

Posts: 3,612

Occupation: Softwareentwickler

  • Send private message

9

Wednesday, October 2nd 2013, 10:32pm

Hab schonmal einige Tests gemacht, darauswird man aber auch nicht schlau.
Das ChangedType gibt aufjedenfall nicht den geänderten MaterialTyp zurück:
Wenn man z.B einen Grassblock unter einer Tür abbaut, dann Kommt als ChangedType Grass und als Block die Tür.
Wenn eine Tür mit Redstone öffnet/schließt kommt als ChangedType der Type des Blockes, der das Redstonesignal an die Tür übergeben hat.
Standard Standart eines Flamingos ist einbeinig.

BtoBastian

Moderator

  • "BtoBastian" is male
  • "BtoBastian" started this thread

Posts: 3,612

Occupation: Softwareentwickler

  • Send private message

10

Saturday, October 5th 2013, 10:37am

Falls es jemanden interessiert:
Ich habs etz so gelöst:

Java source code

1
2
3
4
5
6
7
8
9
10
11
12
@EventHandler
public void onBlockPhysics(BlockPhysicsEvent event){
	final Material m = event.getBlock().getType();
	final Block b = event.getBlock();
	Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(), new Runnable() {
	   public void run() {
	    	if(b.getType() != m){
				Bukkit.broadcastMessage("Zerstört: " + m);
	    	}
	   }
	}, 1);
}


Falls jemand eine bessere Lösung kennt, bitte melden.
Ich glaub nicht, dass das die beste ist.
Aber sie geht.
Man muss nur beachten, dass bei einer Tür das Event z.B. zweimal gefeuert wird, da eine Tür ja aus zwei Teilen besteht.

MfG Basti
Standard Standart eines Flamingos ist einbeinig.

Bitte besucht unser neues Forum unter https://forum.nitrado.net| Please visit our new Forum at https://forum.nitrado.net

Similar threads