Sie sind nicht angemeldet.

  • Anmelden

[Java] DropItems

Lieber Besucher, herzlich willkommen bei: Nitrado.net Prepaid Gameserver Community-Support. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

YourSky

User / Kunde

  • »YourSky« ist der Autor dieses Themas

Beiträge: 1 439

Beruf: HTML3 Hacker

Danksagungen: 5

  • Nachricht senden

1

Dienstag, 8. Oktober 2013, 21:02

DropItems

Guten Abend,
in einem Spielmodi möchte ich das ein Spieler max. 5 Gold Ingots einsammeln darf, falls er mehr einsammelt soll der Ingot bzw. die Ingots wieder gedroppt werden. Ich habe es bereits probiert hier ist mein Code:
Listener (funktioniert, getestet mit noob debugging :P ): http://hastebin.com/poyikoheqi.avrasm
Methoden: http://hastebin.com/tadujoraqo.coffee
Mit freundlichen Grüßen,
Yonas


TimBone

User / Kunde

Beiträge: 1 054

Danksagungen: 2

  • Nachricht senden

2

Dienstag, 8. Oktober 2013, 21:12

Cancell das Event doch einfach falls der Spieler >= 5 Gold Ingots im Inventory hat? & was funktioniert nicht? :D

Zitat von »Linus Torvalds«

Nur Weicheier benutzen Datensicherungen auf Band: richtige Männer laden ihren wichtigen Kram einfach auf einen FTP und lassen diesen vom Rest der Welt spiegeln

YourSky

User / Kunde

  • »YourSky« ist der Autor dieses Themas

Beiträge: 1 439

Beruf: HTML3 Hacker

Danksagungen: 5

  • Nachricht senden

3

Dienstag, 8. Oktober 2013, 21:41

Geht leider nicht, denn die gedroppten Items fassen sich zu einem Itemstack zusammen deshalb kann es sein das wenn er 4 hat und dann 2 einsammelt die sich zu einem ItemStack zusammengefasst haben hat der Spieler 6 Items im Inventar.
Mit freundlichen Grüßen,
Yonas


Stuppsman

User / Kunde

Beiträge: 2 769

Danksagungen: 25

  • Nachricht senden

4

Mittwoch, 9. Oktober 2013, 01:37

Dann überprüfst du, wieviele er vorher hatte und dropst den Überschuss wieder?
Nein, ich hab kein Skype.. bei Interesse an einer privaten Unterrichtsstunde, wende dich bitte direkt an mein Team! 8)

YourSky

User / Kunde

  • »YourSky« ist der Autor dieses Themas

Beiträge: 1 439

Beruf: HTML3 Hacker

Danksagungen: 5

  • Nachricht senden

5

Mittwoch, 9. Oktober 2013, 14:20

Habe ich ja bereits probiert, aber aus irgendeinem Grund hat er nix gedroppt:

Java-Quelltext

1
Staff.getInstance().dropItems(e.getPlayer().getInventory(), Material.GOLD_INGOT.getId(), (ArenaManager.getInstance().getArena(e.getPlayer()).getPlayer(e.getPlayer()).getPlayerClass().getMaxIngots() - Staff.getInstance().getItemAmount(e.getPlayer(), true, Material.GOLD_INGOT.getId(), e.getItem().getItemStack().getTypeId())));
Mit freundlichen Grüßen,
Yonas


Stuppsman

User / Kunde

Beiträge: 2 769

Danksagungen: 25

  • Nachricht senden

6

Mittwoch, 9. Oktober 2013, 14:31

Da kann man doch nicht folgen.. ich drop Items aber über das World-Objekt:

player.getWorld().dropItem(player.getLocation(), new ItemStack(bla)); (glaub ich)

Hol dir die Anzahl auf jeden Fall vorher.. dann findest du viel schneller Fehler, als in ner Zeile, die über 2-3 Fenster geht.
Nein, ich hab kein Skype.. bei Interesse an einer privaten Unterrichtsstunde, wende dich bitte direkt an mein Team! 8)

YourSky

User / Kunde

  • »YourSky« ist der Autor dieses Themas

Beiträge: 1 439

Beruf: HTML3 Hacker

Danksagungen: 5

  • Nachricht senden

7

Mittwoch, 9. Oktober 2013, 15:47

Okay :)
also der Fehler ist folgender:

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
	public void dropItems(Player p, int id, int amount) {
		ItemStack[] items = p.getInventory().getContents();
		for (int i = 0; i < items.length; i++) {
			ItemStack is = items[i];
			if (is != null && is.getType().getId() == id) {
				int newamount = is.getAmount() - amount;
				if (newamount > 0) {
					is.setAmount(newamount);
					p.getWorld().dropItem(p.getLocation(), is);
					break;
				} else {
					items[i] = new ItemStack(Material.AIR);
					amount = -newamount;
					if (amount == 0) break;
				}
			}
		}
		p.getInventory().setContents(items);
	}

und zwar scheitert er an dieser Zeile:

Java-Quelltext

1
if (is != null && is.getType().getId() == id) {

und so rufe ich die auf

Java-Quelltext

1
dropItems(e.getPlayer().getInventory(), Material.GOLD_INGOT.getId(), differenc);


PS: Ich habe mir die differenc ausgegeben und die ist auch richtig
Mit freundlichen Grüßen,
Yonas


YourSky

User / Kunde

  • »YourSky« ist der Autor dieses Themas

Beiträge: 1 439

Beruf: HTML3 Hacker

Danksagungen: 5

  • Nachricht senden

8

Donnerstag, 10. Oktober 2013, 16:22

Hat keiner einer Idee? Weil ich komme leider nicht weiter.
Mit freundlichen Grüßen,
Yonas


Down4Death

User / Kunde

  • »Down4Death« ist männlich

Beiträge: 5

Wohnort: Zuhause

Beruf: Developer

  • Nachricht senden

9

Donnerstag, 10. Oktober 2013, 18:12

Fehler Genauer

Hallo lieber Jan,
könntest du mir bitte deinen Fehler noch etwas genauer schildern?
Bin grade dabei es zu untersuchen.
Lieber Grüße
Bukkit Plugin Development und Server Einrichtung. Du möchtest ein Plugin oder einen Server eingerichtet haben? Schick mir einfach hier im Forum eine Nachricht.


YourSky

User / Kunde

  • »YourSky« ist der Autor dieses Themas

Beiträge: 1 439

Beruf: HTML3 Hacker

Danksagungen: 5

  • Nachricht senden

10

Donnerstag, 10. Oktober 2013, 18:22

Also folgendes Beispiel:
4 Stück sind im Stack der auf dem Boden liegt
4 Stück sind im Inventar des Spielers
5 Stück sind erlaubt
Das heißt wir müssen 3 Items droppen
allerdings droppt der die Items aber der ganze Stack wird trotzdem bei dem Spieler draufgerechnet
Mit freundlichen Grüßen,
Yonas


TimBone

User / Kunde

Beiträge: 1 054

Danksagungen: 2

  • Nachricht senden

11

Donnerstag, 10. Oktober 2013, 18:24

Vllt. musst du das Inventory noch updaten? Hab mjr den Code nicht genau angeschaut, könnt aber gut daran liegen.

Zitat von »Linus Torvalds«

Nur Weicheier benutzen Datensicherungen auf Band: richtige Männer laden ihren wichtigen Kram einfach auf einen FTP und lassen diesen vom Rest der Welt spiegeln

YourSky

User / Kunde

  • »YourSky« ist der Autor dieses Themas

Beiträge: 1 439

Beruf: HTML3 Hacker

Danksagungen: 5

  • Nachricht senden

12

Donnerstag, 10. Oktober 2013, 18:25

Inventar habe ich auch geupdated.
Mit freundlichen Grüßen,
Yonas


Down4Death

User / Kunde

  • »Down4Death« ist männlich

Beiträge: 5

Wohnort: Zuhause

Beruf: Developer

  • Nachricht senden

13

Donnerstag, 10. Oktober 2013, 21:01

Okey...

Hey Jan, ich habe grade wenig Zeit. Ich gucke mir den Code morgen noch einmal an. Hier ist erstmal ein Code wie man aus einem Inventar Items removen kann, vielleicht kannst du damit mehr anfangen. Bis Morgen.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  public static void removeInventoryItems(Inventory inv, int type, int amount) {
      ItemStack[] items = inv.getContents();
      for (int i = 0; i < items.length; i++) {
          ItemStack is = items[i];
          if (is != null && is.getTypeId() == type) {
              int newamount = is.getAmount() - amount;
              if (newamount > 0) {
                  is.setAmount(newamount);
                  break;
              } else {
                  items[i] = new ItemStack(Material.AIR);
                  amount = -newamount;
                  if (amount == 0) break;
              }
          }
      }
      inv.setContents(items);
  }
Bukkit Plugin Development und Server Einrichtung. Du möchtest ein Plugin oder einen Server eingerichtet haben? Schick mir einfach hier im Forum eine Nachricht.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Down4Death« (11. Oktober 2013, 08:52)


DerFeliix

unregistriert

14

Donnerstag, 10. Oktober 2013, 22:07

Ist das nicht der selbe Code?

YourSky

User / Kunde

  • »YourSky« ist der Autor dieses Themas

Beiträge: 1 439

Beruf: HTML3 Hacker

Danksagungen: 5

  • Nachricht senden

15

Donnerstag, 10. Oktober 2013, 22:10

@DerFeliix Das ist korrekt, wollte es gerade auch schreiben, aber danke für deine Bemühungen @Down4Death.
Mit freundlichen Grüßen,
Yonas


Down4Death

User / Kunde

  • »Down4Death« ist männlich

Beiträge: 5

Wohnort: Zuhause

Beruf: Developer

  • Nachricht senden

16

Freitag, 11. Oktober 2013, 09:02

Hmmm.

Hallo,
mir ist eine Sache noch etwas unklar.
Du willst doch überprüfen ob der Spieler schon 5 Items im Inventar hat. Wenn er mehr als 5 einsammelt werden die überflüssigen gedroppt.
Soweit richtig?
Wenn ja, wo prüfst du ab, ob er schon mehr Im Inventar hat, weil die Funktion (welche wir ja anscheinend beide benutzen :P )
ist ja eigentlich nur dafür da die Anzahl die man ihr gibt also remvoveItems(p.getInventory(), itemID, AMOUT) zu removen und bei dir dann auch zu droppen. Aber woher soll die Funktion wissen das sie ganz genaus so viele droppen soll bis es 5 sind. Oder prüfst du das ab?
Bukkit Plugin Development und Server Einrichtung. Du möchtest ein Plugin oder einen Server eingerichtet haben? Schick mir einfach hier im Forum eine Nachricht.


YourSky

User / Kunde

  • »YourSky« ist der Autor dieses Themas

Beiträge: 1 439

Beruf: HTML3 Hacker

Danksagungen: 5

  • Nachricht senden

17

Freitag, 11. Oktober 2013, 13:55

@Down4Death
Korrekt, ich habe eine Methode die die Anzahl der Items berechnet:

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
	public int getItemAmount(Player player, int id){
		PlayerInventory inventory = player.getInventory();
		ItemStack[] items = inventory.getContents();
		int has = 0;
		for (ItemStack item : items) {
			if ((item != null) && (item.getTypeId() == id) && (item.getAmount() > 0)) {
				has += item.getAmount();
			}
		}

		return has;
	}

hierst ist mal der aktuelle listener:
http://hastebin.com/jituxubame.avrasm

edit:
PS: Ich weis das die id 12 nicht die von Gold Ingots ist :)
Mit freundlichen Grüßen,
Yonas


YourSky

User / Kunde

  • »YourSky« ist der Autor dieses Themas

Beiträge: 1 439

Beruf: HTML3 Hacker

Danksagungen: 5

  • Nachricht senden

18

Samstag, 12. Oktober 2013, 16:43

push# keiner einer ne idee?
Mit freundlichen Grüßen,
Yonas


YourSky

User / Kunde

  • »YourSky« ist der Autor dieses Themas

Beiträge: 1 439

Beruf: HTML3 Hacker

Danksagungen: 5

  • Nachricht senden

19

Sonntag, 13. Oktober 2013, 23:12

#le push,
ist es zu kompliziert formuliert? oder hat keiner eine Idee? Falls das erste zutrifft formuliere ich es hier nochmal:
Das Problem ist das sich "gedroppte" Items stacken. Zum Beispiel: der Spieler hat 4 Gold Ingots in seinem Inventar, dann sammelt er 4 Stück ein (zufälliges Beispiel könnten auch 39 sein) also hat er jetzt 8 Stück im Inventar. Nun möchte ich 3 Stück droppen (da maximal 5 erlaubt sind).
-
Mit freundlichen Grüßen,
Yonas


lualzockt

User / Kunde

  • »lualzockt« ist männlich

Beiträge: 1 380

Beruf: Ferien

Danksagungen: 9

  • Nachricht senden

20

Montag, 14. Oktober 2013, 07:25

On der EntityItem Klasse gibt es die Methode a(ItemStack it). Du könntest dir eine eigene Klasse erstellen, die daraus erbt, die betreffende Methode überschreiben und ItemSpawnEvent das Item zu dieser Klasse casten und wieder setzen.

Mfg Lukas

Zitat

It is not a bug, it a new feature.