Wann hast du eigentlich mit programmieren angefangen und in welcher Sprache
Vor ca. 9 Jahren und mit JavaScript und dann weiter mit PHP
Wann hast du eigentlich mit programmieren angefangen und in welcher Sprache
@geNAZt Würdest Du jedem empfehlen, vorallem im Zeitalter der vorranschreitenden Technologie, Programmierung zu beherrschen oder zu lernen?
Man kann ja nicht jeden dazu "zwingen", etwas zu lernen, wofür er nicht geeignet ist oder er es selbst nicht lernen will.Nein, es wird sich zwar im Jobmarkt ein wenig verschieben und die traditionellen Berufe werden immer weniger gefragt aber jeder sollte das lernen was einem liegt und versuchen dort in den Stellenmarkt einzusteigen.
Du musst prüfen ob der Damager von der event.getEntity() ein Pfeil ist (instanceof Arrow) und dass event dann canceln (und gebenen falls prüfen ob der Pfeil von einem Spieler geschossen wurde -> Pfeil zu Arrow casten und prüfen ob arrow.getShooter() instanceof Player ist)
Genau ^^Man kann ja nicht jeden dazu "zwingen", etwas zu lernen, wofür er nicht geeignet ist oder er es selbst nicht lernen will.
Die Fehlermeldung kommt daher, dass du den Arrow nicht in deine Array List packst .Irgendiwe kommt dan eine riesen fehler meldung und die leute können sich immer noch mit bogen im team gegenseitig angreifen.
Ich habs jetzt so:
if(Main.red.contains(p.getName())){
if(Main.red.contains(killer.getName())){
if(e.getDamager() instanceof Arrow){
e.setDamage(0D);
e.setCancelled(true);
}
}
}
if(Main.blue.contains(p.getName())){
if(Main.blue.contains(killer.getName())){
if(e.getDamager() instanceof Arrow){
e.setDamage(0D);
e.setCancelled(true);
}
}
}
if(Main.blue.contains(p.getName())){
if(Main.red.contains(killer.getName())){
if(e.getDamager() instanceof Arrow){
e.setCancelled(false);
}
}
}
if(Main.red.contains(p.getName())){
if(Main.blue.contains(killer.getName())){
if(e.getDamager() instanceof Arrow){
e.setCancelled(false);
}
}
}
@SuppressWarnings("deprecation")
@EventHandler
public void onDamage(EntityDamageByEntityEvent e){
Player angreifer = (Player)e.getDamager();
Player spieler = (Player)e.getEntity();
Arrow a = (Arrow)e.getDamager();
if(angreifer instanceof Player){
if(test.contains(spieler.getName())){
e.setCancelled(true);
}
else if(a instanceof Arrow){
if(test.contains(a.getShooter())){
e.setCancelled(true);
}
}
}
}
Die Fehlermeldung kommt daher, dass du den Arrow nicht in deine Array List packst .
Versuch es doch mal so:
Code:@SuppressWarnings("deprecation") @EventHandler public void onDamage(EntityDamageByEntityEvent e){ Player angreifer = (Player)e.getDamager(); Player spieler = (Player)e.getEntity(); Arrow a = (Arrow)e.getDamager(); if(angreifer instanceof Player){ if(test.contains(spieler.getName())){ e.setCancelled(true); } else if(a instanceof Arrow){ if(test.contains(a.getShooter())){ e.setCancelled(true); } } } }
Oder if (p.isSneaking)Mit welchem event kann man abfragen ob ein spieler sneakt oder mit dem schwert blockt ? würde mich mal so Interesiren. Danke schon mal.
ah dankePlayerToggleSneakEvent.
Bitte schau dazu in die API: http://jd.bukkit.org/rb/doxygen/d1/...vent_1_1player_1_1PlayerToggleSneakEvent.html
dankeOder if (p.isSneaking)
Wenn man die Situation/das Problem betrachtet, ist das eine unsaubere und umständliche Lösung. Das Sneaken ist ja der Auslöser für eine AktionOder if (p.isSneaking)
Kommt jetzt vielleicht ein bisschen spät und hoffe, dass ich Ironie nicht übersehen habe (wobei es sein könnte oO) , aber hier mal meine Version dazu und Anmerkungen:Countdown:
Code:try { int countDown = 10; for(;;) { if ( countDown == 0 ) { break; } try { Thread.sleep(1000); } catch ( InterruptedException e ) { } // Always returns true if (true) { Bukkit.broadcastMessage( countDown ); } countDown--; } } catch ( OutOfMemoryException e ) { } // Memory problems ?! NOPE
So machen wir das immer![]()
public class CountdownTask implements Runnable {
private Plugin plugin;
private int countDown;
public CountdownTask( int countDown, Plugin plugin ) {
this.countDown = countDown;
this.plugin = plugin;
}
@Override
public void run() {
if( countDown == 0 ) {
return;
}
plugin.getServer().getScheduler().scheduleSyncDelayedTask( plugin, new Runnable() {
@Override
public void run() {
Bukkit.broadcastMessage( countDown );
}
} );
countDown--;
plugin.getServer().getScheduler().runTaskLaterAsynchronously( plugin, this, 20L );
}
}
[Plugin].getServer().getScheduler().runTaskLaterAsynchronously( [Plugin], new CountdownTask([DauerInSekunden], [Plugin]), 20L );
Guten Abend,
Kommt jetzt vielleicht ein bisschen spät und hoffe, dass ich Ironie nicht übersehen habe (wobei es sein könnte oO) , aber hier mal meine Version dazu und Anmerkungen:
Dann der Aufruf über:Code:public class CountdownTask implements Runnable { private Plugin plugin; private int countDown; public CountdownTask( int countDown, Plugin plugin ) { this.countDown = countDown; this.plugin = plugin; } @Override public void run() { if( countDown == 0 ) { return; } plugin.getServer().getScheduler().scheduleSyncDelayedTask( plugin, new Runnable() { @Override public void run() { Bukkit.broadcastMessage( countDown ); } } ); countDown--; plugin.getServer().getScheduler().runTaskLaterAsynchronously( plugin, this, 20L ); } }
Code:[Plugin].getServer().getScheduler().runTaskLaterAsynchronously( [Plugin], new CountdownTask([DauerInSekunden], [Plugin]), 20L );
Dinge, die ich bei dir nicht ganz verstehe:
Gruß KingNyuels
- Leere "catch"-Blöcke sind immer schlecht. Das Mindeste ist es, dass du die Fehler loggst.
- "if( true )" ist genauso sinnlos. Diese Entscheidungsstruktur wird erst false, wenn die Virtuelle Maschine herunterfährt.
- Bukkit.broadcastMessage() ist nicht thread-safe (kann sich letztens was geändert haben - kann aber gerade nicht nachgucken), daher finde ich das ziemlich schlecht gelöst. Denn, wenn du das auf dem Hauptthread ausführst, hat das den Nachteil, dass der ganze Server eingefroren ist. Führst du asynchron aus, kann das zu unerwarteten Fehlern führen.
Joa, das wollte ich (wirklich) noch dazu schreiben, die if Schleife ist natürlich Situationsbedingt. Allerdings kann die If schleife ab und zu effizienter sein, als das PlayerToggleSneakEvent. Aber du hast da natürlich vollkommen Recht.Wenn man die Situation/das Problem betrachtet, ist das eine unsaubere und umständliche Lösung. Das Sneaken ist ja der Auslöser für eine Aktion
Ansonsten müsste man diese if Abfrage in einer while(1) schleife laufen lassen und das ist echt unschön![]()