SteamWar/BauSystem
Archiviert
13
0

Fix Loader Redstone #89

Manuell gemergt
Lixfel hat 7 Commits von loaderfix nach master 2020-08-29 11:33:04 +02:00 zusammengeführt

Datei anzeigen

@ -3,12 +3,15 @@ package de.steamwar.bausystem.world;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.Powerable; import org.bukkit.block.data.Powerable;
import org.bukkit.block.data.type.Switch;
import org.bukkit.event.block.Action; import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
class AutoLoader_15 { class AutoLoader_15 {
private AutoLoader_15() { private AutoLoader_15() {
} }
@ -30,10 +33,32 @@ class AutoLoader_15 {
Powerable powerable = (Powerable) data; Powerable powerable = (Powerable) data;
powerable.setPowered(active); powerable.setPowered(active);
block.setBlockData(powerable); block.setBlockData(powerable);
block.getState().update(true);
if (data instanceof Switch){
Switch swtch = (Switch) data;
Block relative;
Veraltet
Review

Das geht eleganter, wenn du mit block.getNeighbour? oder so ähnlich arbeitest, da übergibst du dann nur ein BlockFace, was die Richtung des Blocks angibt.

Das geht eleganter, wenn du mit block.getNeighbour? oder so ähnlich arbeitest, da übergibst du dann nur ein BlockFace, was die Richtung des Blocks angibt.
Veraltet
Review

Ich habe kurz mit ihm gesprochen, dass man das nicht mit clones macht sondern das man die echte location Offsetet ohne eine Kopie zu machen.

Ich habe kurz mit ihm gesprochen, dass man das nicht mit clones macht sondern das man die echte location Offsetet ohne eine Kopie zu machen.
switch(swtch.getFace()){
case FLOOR:
relative = block.getRelative(BlockFace.DOWN);
break;
case CEILING:
relative = block.getRelative(BlockFace.UP);
break;
default:
relative = block.getRelative(swtch.getFacing());
break;
Veraltet
Review

Funktioniert das auch, wenn man einfach denselben block (wie er eh gerade da ist) hinsetzt? das wäre eleganter, wenn es funktioniert.

Funktioniert das auch, wenn man einfach denselben block (wie er eh gerade da ist) hinsetzt? das wäre eleganter, wenn es funktioniert.
Veraltet
Review

Nein, weil das dann theoretisch soweit ich es verstanden habe kein Block Change ist, weil es ja derselbe ist

Nein, weil das dann theoretisch soweit ich es verstanden habe kein Block Change ist, weil es ja derselbe ist
Veraltet
Review

Habe es grade auch noch mal getestet, es würden keine BlockUpdates auf das Redstone hinter dem Block kommen.

Habe es grade auch noch mal getestet, es würden keine BlockUpdates auf das Redstone hinter dem Block kommen.
Veraltet
Review

Wenn man ein BlockUpdate auf die Blöcke sendet, die 1 UND 2 Block weit entfernt sind? Das hauptproblem ist ja, dass bei einem Block Distanz eine Änderung stattfinden muss, damit das triggert. (Btw. würde ich immer noch bevorzugen, wenn das ganze über Blockfaces läuft (block.getRelative()), da muss dann nichts geklont, und auch keine offsets addiert werden. Dann ggf. mit einem Rekursiven Algorithmus, der die Blocktiefe auf 2 beschränkt?

Wenn man ein BlockUpdate auf die Blöcke sendet, die 1 UND 2 Block weit entfernt sind? Das hauptproblem ist ja, dass bei einem Block Distanz eine Änderung stattfinden muss, damit das triggert. (Btw. würde ich immer noch bevorzugen, wenn das ganze über Blockfaces läuft (block.getRelative()), da muss dann nichts geklont, und auch keine offsets addiert werden. Dann ggf. mit einem Rekursiven Algorithmus, der die Blocktiefe auf 2 beschränkt?
}
updateBlock(relative);
}
return true; return true;
} }
static void updateBlock(Block block) {
BlockData data = block.getBlockData();
block.setType(Material.BARRIER, true);
block.setBlockData(data, true);
}
static void onPlayerInteract(IAutoLoader loader, PlayerInteractEvent event) { static void onPlayerInteract(IAutoLoader loader, PlayerInteractEvent event) {
if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.PHYSICAL) if (event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.PHYSICAL)
return; return;