You are not logged in.

  • Login

[Java] DropItems

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

Dear visitor, welcome to Nitrado.net Prepaid Gameserver Community-Support - Archiv. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

YourSky

User / Kunde

  • "YourSky" started this thread

Posts: 1,430

Occupation: HTML3 Hacker

Thanks: 5

  • Send private message

1

Tuesday, October 8th 2013, 9:02pm

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

Posts: 1,053

Thanks: 2

  • Send private message

2

Tuesday, October 8th 2013, 9:12pm

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" started this thread

Posts: 1,430

Occupation: HTML3 Hacker

Thanks: 5

  • Send private message

3

Tuesday, October 8th 2013, 9:41pm

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

Posts: 2,766

Thanks: 25

  • Send private message

4

Wednesday, October 9th 2013, 1:37am

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" started this thread

Posts: 1,430

Occupation: HTML3 Hacker

Thanks: 5

  • Send private message

5

Wednesday, October 9th 2013, 2:20pm

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

Java source code

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

Posts: 2,766

Thanks: 25

  • Send private message

6

Wednesday, October 9th 2013, 2:31pm

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" started this thread

Posts: 1,430

Occupation: HTML3 Hacker

Thanks: 5

  • Send private message

7

Wednesday, October 9th 2013, 3:47pm

Okay :)
also der Fehler ist folgender:

Java source code

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 source code

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

und so rufe ich die auf

Java source code

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" started this thread

Posts: 1,430

Occupation: HTML3 Hacker

Thanks: 5

  • Send private message

8

Thursday, October 10th 2013, 4:22pm

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


Down4Death

User / Kunde

  • "Down4Death" is male

Posts: 5

Location: Zuhause

Occupation: Developer

  • Send private message

9

Thursday, October 10th 2013, 6:12pm

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" started this thread

Posts: 1,430

Occupation: HTML3 Hacker

Thanks: 5

  • Send private message

10

Thursday, October 10th 2013, 6:22pm

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

Posts: 1,053

Thanks: 2

  • Send private message

11

Thursday, October 10th 2013, 6:24pm

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" started this thread

Posts: 1,430

Occupation: HTML3 Hacker

Thanks: 5

  • Send private message

12

Thursday, October 10th 2013, 6:25pm

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


Down4Death

User / Kunde

  • "Down4Death" is male

Posts: 5

Location: Zuhause

Occupation: Developer

  • Send private message

13

Thursday, October 10th 2013, 9:01pm

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.

Source code

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.

This post has been edited 1 times, last edit by "Down4Death" (Oct 11th 2013, 8:52am)


DerFeliix

Unregistered

14

Thursday, October 10th 2013, 10:07pm

Ist das nicht der selbe Code?

YourSky

User / Kunde

  • "YourSky" started this thread

Posts: 1,430

Occupation: HTML3 Hacker

Thanks: 5

  • Send private message

15

Thursday, October 10th 2013, 10:10pm

@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" is male

Posts: 5

Location: Zuhause

Occupation: Developer

  • Send private message

16

Friday, October 11th 2013, 9:02am

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" started this thread

Posts: 1,430

Occupation: HTML3 Hacker

Thanks: 5

  • Send private message

17

Friday, October 11th 2013, 1:55pm

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

Java source code

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" started this thread

Posts: 1,430

Occupation: HTML3 Hacker

Thanks: 5

  • Send private message

18

Saturday, October 12th 2013, 4:43pm

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


YourSky

User / Kunde

  • "YourSky" started this thread

Posts: 1,430

Occupation: HTML3 Hacker

Thanks: 5

  • Send private message

19

Sunday, October 13th 2013, 11:12pm

#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" is male

Posts: 1,380

Occupation: Ferien

Thanks: 9

  • Send private message

20

Monday, October 14th 2013, 7:25am

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.


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