Schneeball Explosion wo Player als Killer gesetzt wird

Wenn ihr bei eurem Plugin nicht weiter kommt, könnt ihr hier euer Problem beschreiben und um Hilfe bitten.

Schneeball Explosion wo Player als Killer gesetzt wird

Beitragvon Summerfeeling » So 11. Mai 2014, 21:47

Hey.
Da ihr wahrscheinlich den Titel nicht verstanden habt, erkläre ich es hier nochmal.

Ich werfe einen Schneeball.
Er landet, und eine Explosion wird erstellt.
Stirbt nun jemand, soll ich - der Werfer - als Killer gesetzt werden.
Ich will es nicht über TNTPrimed (also als Entity spawnen) machen.

Hoffe ihr könnt mir helfen :)
Grüße
Summerfeeling | Timo
Benutzeravatar
Summerfeeling
 
Beiträge: 1300
Registriert: Sa 15. Jun 2013, 18:43
Wohnort: Viersen

Re: Schneeball Explosion wo Player als Killer gesetzt wird

Beitragvon Jofkos » So 11. Mai 2014, 22:34

Mach die Explosion über
Code: Alles auswählen
  1. ((CraftWorld) loc.getWorld()).getHandle().createExplosion(Entity damager, Double x, Double y, Double z, float power, boolean setFire, boolean breakBlocks);
Als Entity übergibst du den Spieler und es müsste klappen. (dort wird dann das EntityDamageByEntityEvent gecallt) (ungetestet)
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

Re: Schneeball Explosion wo Player als Killer gesetzt wird

Beitragvon Summerfeeling » Mo 12. Mai 2014, 20:55

Jofkos hat geschrieben:Mach die Explosion über
Code: Alles auswählen
  1. ((CraftWorld) loc.getWorld()).getHandle().createExplosion(Entity damager, Double x, Double y, Double z, float power, boolean setFire, boolean breakBlocks);
Als Entity übergibst du den Spieler und es müsste klappen. (dort wird dann das EntityDamageByEntityEvent gecallt) (ungetestet)


Werde es testen. Danke schonmal! :)
Grüße
Summerfeeling | Timo
Benutzeravatar
Summerfeeling
 
Beiträge: 1300
Registriert: Sa 15. Jun 2013, 18:43
Wohnort: Viersen

Re: Schneeball Explosion wo Player als Killer gesetzt wird

Beitragvon Summerfeeling » Mo 12. Mai 2014, 21:14

Hey.
Leider kommt eine ClassCastException.
Code: Alles auswählen
  1. [22:12:55 ERROR]: Could not pass event ProjectileHitEvent to CreepyGunGame v2.0
  2. org.bukkit.event.EventException
  3.         at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:320) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
  4.         at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
  5.         at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:486) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
  6.         at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:471) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
  7.         at org.bukkit.craftbukkit.v1_7_R1.event.CraftEventFactory.callProjectileHitEvent(CraftEventFactory.java:609) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
  8.         at net.minecraft.server.v1_7_R1.EntityProjectile.h(EntityProjectile.java:158) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
  9.         at net.minecraft.server.v1_7_R1.World.entityJoinedWorld(World.java:1348) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
  10.         at net.minecraft.server.v1_7_R1.World.playerJoinedWorld(World.java:1329) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
  11.         at net.minecraft.server.v1_7_R1.World.tickEntities(World.java:1217) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
  12.         at net.minecraft.server.v1_7_R1.WorldServer.tickEntities(WorldServer.java:480) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
  13.         at net.minecraft.server.v1_7_R1.MinecraftServer.u(MinecraftServer.java:637) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
  14.         at net.minecraft.server.v1_7_R1.DedicatedServer.u(DedicatedServer.java:250) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
  15.         at net.minecraft.server.v1_7_R1.MinecraftServer.t(MinecraftServer.java:545) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
  16.         at net.minecraft.server.v1_7_R1.MinecraftServer.run(MinecraftServer.java:457) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
  17.         at net.minecraft.server.v1_7_R1.ThreadServerApplication.run(SourceFile:617) [craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
  18. Caused by: java.lang.ClassCastException: org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer cannot be cast to net.minecraft.server.v1_7_R1.Entity
  19.         at de.Summerfeeling.GunGame.Listener.ProjectileHitListener.onProjectileHit(ProjectileHitListener.java:19) ~[?:?]
  20.         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_25]
  21.         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_25]
  22.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_25]
  23.         at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_25]
  24.         at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:318) ~[craftbukkit.jar:git-Bukkit-1.7.2-R0.3-b3020jnks]
  25.         ... 14 more

bei folgendem Code:
Code: Alles auswählen
  1. package de.Summerfeeling.GunGame.Listener;
  2. import net.minecraft.server.v1_7_R1.Entity;
  3. import org.bukkit.craftbukkit.v1_7_R1.CraftWorld;
  4. import org.bukkit.entity.Player;
  5. import org.bukkit.entity.Snowball;
  6. import org.bukkit.event.EventHandler;
  7. import org.bukkit.event.Listener;
  8. import org.bukkit.event.entity.ProjectileHitEvent;
  9. public class ProjectileHitListener implements Listener {
  10.    @EventHandler
  11.    public void onProjectileHit(ProjectileHitEvent e) {
  12.       if(e.getEntity() instanceof Snowball) {
  13.          Snowball ball = (Snowball) e.getEntity();
  14.          if(ball.getShooter() instanceof Player) {
  15.             ((CraftWorld) ball.getWorld()).getHandle().createExplosion((Entity) ball.getShooter(), ball.getLocation().getX(), ball.getLocation().getY()+1, ball.getLocation().getZ(), 0.5F, false, false);
  16.          }
  17.       }
  18.    }
  19.    
  20. }


19. Zeile (Wieso auch immer es hier die 20, ist :D)
Code: Alles auswählen
  1. ((CraftWorld) ball.getWorld()).getHandle().createExplosion((Entity) ball.getShooter(), ball.getLocation().getX(), ball.getLocation().getY()+1, ball.getLocation().getZ(), 0.5F, false, false);
Grüße
Summerfeeling | Timo
Benutzeravatar
Summerfeeling
 
Beiträge: 1300
Registriert: Sa 15. Jun 2013, 18:43
Wohnort: Viersen

Re: Schneeball Explosion wo Player als Killer gesetzt wird

Beitragvon monst12 » Mo 12. Mai 2014, 21:21

Ich bin da nicht allzu fit drin... Aber mach mal aus dem Entity Player einen CraftPlayer.

Er meckert, da der Player, den du als Shooter überprüfst ja als Entity (Castest es sogar zur Entity) verwendet wird, dennoch will er wohl einen CraftPlayer als Parameter.

Also dann wohl so:
Shooter ggf. vorher zum Player casten.

Code: Alles auswählen
  1. Player p = (Player) e.getShooter();
  2. ((CraftPlayer)p).getHandle()


Wenn er eine Entity verlangt müsste ihm trotzdem der CraftPlayer reichen, da dieser Entity LivingEntity uvm. beinhaltet. Im Notfall probiers nochmal den CraftPlayer zur Entity zu casten.
Ich hoffe das alles stimmt so.

MfG
monst12
Soweit die Theorie.

MfG
monst12
Benutzeravatar
monst12
 
Beiträge: 239
Registriert: Sa 19. Apr 2014, 22:14

Re: Schneeball Explosion wo Player als Killer gesetzt wird

Beitragvon Jofkos » Mo 12. Mai 2014, 22:09

Du musst den Spieler zu CraftPlayer casten und dann getHandle(). Du kannst Bukkit nicht direct zu NMS Casten :)
Code: Alles auswählen
  1. ((CraftWorld) ball.getWorld()).getHandle().createExplosion(((CraftPlayer) ball.getShooter()).getHandle(), ball.getLocation().getX(), ball.getLocation().getY()+1, ball.getLocation().getZ(), 0.5F, false, false);

EDIT: uuups das hat @monst12 schon erwähnt :D
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

Re: Schneeball Explosion wo Player als Killer gesetzt wird

Beitragvon Summerfeeling » Di 13. Mai 2014, 01:42

Danke. Läuft perfekt.

Noch eine Frage, ist es möglich, einem Damage zu geben, und dort einen Spieler als Damager zu übergeben?
ALso z.B. ich kille jemanden, und die Person XY wird als Killer gesetzt?
Grüße
Summerfeeling | Timo
Benutzeravatar
Summerfeeling
 
Beiträge: 1300
Registriert: Sa 15. Jun 2013, 18:43
Wohnort: Viersen

Re: Schneeball Explosion wo Player als Killer gesetzt wird

Beitragvon Jofkos » Di 13. Mai 2014, 06:32

Joa. Müsste so gehen:
Code: Alles auswählen
  1. Player damager;
  2. Player damaged;
  3. double damage = 10;
  4. ((CraftPlayer)damaged).damage(damage, damager)
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

Re: Schneeball Explosion wo Player als Killer gesetzt wird

Beitragvon Summerfeeling » Mi 14. Mai 2014, 19:23

Hey.
Die Explosion wird erstellt, aber irgendwie nimmt man keinen Schaden? :/
Muss ich im EntityDamageByEntityEvent den Damage selber setzen?

Aktueller Code:
Code: Alles auswählen
  1. package de.Summerfeeling.GunGame;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.Random;
  7. import org.bukkit.Bukkit;
  8. import org.bukkit.entity.Player;
  9. import org.bukkit.plugin.java.JavaPlugin;
  10. import de.Summerfeeling.GunGame.Listener.PlayerDeathListener;
  11. import de.Summerfeeling.GunGame.Listener.PlayerFishListener;
  12. import de.Summerfeeling.GunGame.Listener.PlayerLoginListener;
  13. import de.Summerfeeling.GunGame.Listener.ProjectileHitListener;
  14. public class GunGame extends JavaPlugin {
  15.    private static LevelManager lm;
  16.    public static GameState state = GameState.LOBBY;
  17.    
  18.    public static Map<String, String> langs = new HashMap<>();
  19.    public static List<Arena> arenas = new ArrayList<>();
  20.    public static List<Arena> voteable_maps = new ArrayList<>();
  21.    
  22.    public void onEnable() {
  23.       GunGame.lm = new LevelManager();
  24.       
  25.       this.loadVoteableMaps();
  26.       
  27.       Bukkit.getPluginManager().registerEvents(new PlayerDeathListener(), this);
  28.       Bukkit.getPluginManager().registerEvents(new PlayerFishListener(), this);
  29.       Bukkit.getPluginManager().registerEvents(new PlayerLoginListener(), this);
  30.       Bukkit.getPluginManager().registerEvents(new ProjectileHitListener(), this);
  31.       
  32.    }
  33.    
  34.    public void onDisable() {
  35.       
  36.    }
  37.    
  38.    public static LevelManager getSBManager() {
  39.       return GunGame.lm;
  40.    }
  41.    
  42.    private void loadVoteableMaps() {
  43.       Random random = new Random();
  44.       while(GunGame.arenas.size() != 0 && GunGame.voteable_maps.size() != 3) {
  45.          Arena arena = GunGame.arenas.get(random.nextInt(GunGame.arenas.size()));
  46.          GunGame.voteable_maps.add(arena);
  47.          GunGame.arenas.remove(arena);
  48.       }
  49.    }
  50.    
  51.    public static String sendMessage(Player player, String de, String en) {
  52.       if(langs.get(player.getName()).equalsIgnoreCase("de")) {
  53.          player.sendMessage(de);
  54.          return de;
  55.       }else if(langs.get(player.getName()).equalsIgnoreCase("en")) {
  56.          player.sendMessage(en);
  57.          return en;
  58.       }else{
  59.          player.sendMessage(en);
  60.          return en;
  61.       }
  62.    }
  63.    
  64. }


Code: Alles auswählen
  1. package de.Summerfeeling.GunGame.Listener;
  2. import org.bukkit.craftbukkit.v1_7_R1.CraftWorld;
  3. import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer;
  4. import org.bukkit.entity.Player;
  5. import org.bukkit.entity.Snowball;
  6. import org.bukkit.event.EventHandler;
  7. import org.bukkit.event.Listener;
  8. import org.bukkit.event.entity.ProjectileHitEvent;
  9. public class ProjectileHitListener implements Listener {
  10.    @EventHandler
  11.    public void onProjectileHit(ProjectileHitEvent e) {
  12.       if(e.getEntity() instanceof Snowball) {
  13.          Snowball ball = (Snowball) e.getEntity();
  14.          if(ball.getShooter() instanceof Player) {
  15.             ((CraftWorld) ball.getWorld()).getHandle().createExplosion(((CraftPlayer) ball.getShooter()).getHandle(), ball.getLocation().getX(), ball.getLocation().getY()+1, ball.getLocation().getZ(), 2.5F, false, false);
  16.          }
  17.       }
  18.    }
  19.    
  20. }
Grüße
Summerfeeling | Timo
Benutzeravatar
Summerfeeling
 
Beiträge: 1300
Registriert: Sa 15. Jun 2013, 18:43
Wohnort: Viersen

Re: Schneeball Explosion wo Player als Killer gesetzt wird

Beitragvon Jofkos » Mi 14. Mai 2014, 19:44

Das Event müsste so gecallt werden:
Code: Alles auswählen
  1. EntityDamageByEntityEvent event = new EntityDamageByEntityEventorg.bukkit.entity.Entity damager, org.bukkit.entity.Entity damaged, EntityDamageEvent.DamageCause.ENTITY_EXPLOSION, floag damage);

Check mal ob's überhaupt ankommt
sonst kannst du ja selber mal nachlesen was passiert, wenn du die Methode aufrufst: (hab dir mal die entsprechenden Zeile markiert ;))
createExplosion in CraftWorld callt -> createExplosion in WorldServer -> callt createExplosion in NMS World -> erstellt eine Explosion in der dann das EntityDamageByEntityEvent gecallt wird
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45


Zurück zu Hilfe und Support

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 23 Gäste

cron