Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

override domyslnego craftingu bukkit


Nocny

Rekomendowane odpowiedzi

Opublikowano

cześć, mam pewien problem - nie mam pojęcia jak zrobic, by ominąć/usunąć domyślny crafting danego itemku a następnie nadać mu inny, proszę o jakieś wskazówki

 

 

 

 

fKJeAI4.jpg

 

 

 

Opublikowano

Próbowałeś rejestrować recipe w swoim własnym pluginie? Bukkit rejestruje craftingi pierwszy, więc to mogłoby zadziałać.­

 

tylko problem jest taki, że ja chce usunąć ten domyślny i zrobić własny, tylko problem w tym, że on zawiera to, co było w starym, przez co nie wiem jak to zrobic, ciężko to opisać, więc może zobrazuje:

 

chce usunac crafting desek i nadpisac go wlasnym, dodajac do tego siekierke obok log'a, tylko problem jest taki, że gdy chce anulowac event przy wykryciu loga na stole, to też anuluje przy tym, jak jest i log i siekierka.

 

 

 

 

fKJeAI4.jpg

 

 

 

Opublikowano

To jak chcesz nowy crafting desek to przy próbie wytworzenia ustaw je w polu po prostu na powietrze i zarejestruj nowy crafting.

 

sygn.png

Opublikowano

To jak chcesz nowy crafting desek to przy próbie wytworzenia ustaw je w polu po prostu na powietrze i zarejestruj nowy crafting.

 

bardziej o jakiś kod bym prosił, bo próbowałem już ustawiać wynik na air przy craftingu, ale to samo działo się jak dodawałem siekierkę.

 

 

 

 

fKJeAI4.jpg

 

 

 

Opublikowano

­Ja bym to tak zrobił (przynajmniej spróbował, nigdy czegoś takiego nie robiłem, ale wydaje się to najlogiczniejsze)

 

1. Stwórz nowy recipe

ShapelessRecipe planks = new ShapelessRecipe(new ItemStack(Material.WOOD, 4));
planks.addIngredient(1, Material.LOG);
planks.addIngredient(1, Material.STONE_AXE);
Bukkit.addRecipe(planks);

2. Cancelluj event kiedy jest tylko LOG.

Moja oficjalna strona! :)

http://socketbyte.pl/ 

Opublikowano

@AdamGrzegorz

 

juz sobie poradzilem, wystarczy ze przelecialem iteratorem po recepturach i usunalem ten, co chcialem a potem zarejestrowalem - jestem głupi :D

 

Kod, gdyby ktos chcial:

Iterator<Recipe> it = getServer().recipeIterator();
	Recipe recipe;
		while(it.hasNext()) {
				recipe = it.next();
					if (recipe != null && recipe.getResult().getType() == Material.WOOD)	{
						it.remove();
					}
			}
			planks();
}
		

private void planks(){
	ShapelessRecipe recipe = new ShapelessRecipe(new ItemStack(Material.WOOD, 4));
	recipe.addIngredient(Material.LOG);
	recipe.addIngredient(Material.GOLD_AXE);
	plugin.getServer().addRecipe(recipe);
	}

tylko jest kolejny problem - chce, zeby do jednego przerobienia np. 40 logow potrzeba byla tylko jedna siekierka, a nie 40

 

 

 

 

fKJeAI4.jpg

 

 

 

Opublikowano

Bodajże musisz sprawdzić przy pomocy PrepareItemCraftEvent czy w danym slocie jest 40 drewna i w innym jedna siekiera i wtedy ustawiać rezultat craftingu. Następnie w InventoryClickEvent sprawdzać aby po kliknięciu na gotową recepturkę zabierało 40 desek i 1 siekierkę. Ja robiłem w podobny sposób i działało.

­

 

rocketnite-sygna.png

Opublikowano

@AdamGrzegorz

 

juz sobie poradzilem, wystarczy ze przelecialem iteratorem po recepturach i usunalem ten, co chcialem a potem zarejestrowalem - jestem głupi :D

 

Kod, gdyby ktos chcial:

Iterator<Recipe> it = getServer().recipeIterator();
	Recipe recipe;
		while(it.hasNext()) {
				recipe = it.next();
					if (recipe != null && recipe.getResult().getType() == Material.WOOD)	{
						it.remove();
					}
			}
			planks();
}
		

private void planks(){
	ShapelessRecipe recipe = new ShapelessRecipe(new ItemStack(Material.WOOD, 4));
	recipe.addIngredient(Material.LOG);
	recipe.addIngredient(Material.GOLD_AXE);
	plugin.getServer().addRecipe(recipe);
	}

tylko jest kolejny problem - chce, zeby do jednego przerobienia np. 40 logow potrzeba byla tylko jedna siekierka, a nie 40

No to o tym mówiłem, tylko dlaczego Iterator zamiast prostej pętli for?

 

­

Moja oficjalna strona! :)

http://socketbyte.pl/ 

Opublikowano

raczej nie widzi mi sie robienie warunku do każdej ilości, zbyt duzo tego by bylo

ogólnie w zwalonym API bukkita... nie zrobisz tego, musisz ręcznie w evencie od EQ/craftingu odejmować durability z toporka, np przerobienie 1 loga, pobiera 1 durability z siekierki.

 

 

 

@AdamGrzegorz

 

juz sobie poradzilem, wystarczy ze przelecialem iteratorem po recepturach i usunalem ten, co chcialem a potem zarejestrowalem - jestem głupi :D

 

Kod, gdyby ktos chcial:

Iterator<Recipe> it = getServer().recipeIterator();
	Recipe recipe;
		while(it.hasNext()) {
				recipe = it.next();
					if (recipe != null && recipe.getResult().getType() == Material.WOOD)	{
						it.remove();
					}
			}
			planks();
}
		

private void planks(){
	ShapelessRecipe recipe = new ShapelessRecipe(new ItemStack(Material.WOOD, 4));
	recipe.addIngredient(Material.LOG);
	recipe.addIngredient(Material.GOLD_AXE);
	plugin.getServer().addRecipe(recipe);
	}

tylko jest kolejny problem - chce, zeby do jednego przerobienia np. 40 logow potrzeba byla tylko jedna siekierka, a nie 40

No to o tym mówiłem, tylko dlaczego Iterator zamiast prostej pętli for?

 

­

 

bo metoda zwraca iterator, i w pętli for nie można usuwać elementów listy

Co najwyżej może to zmienić na:


        Recipe recipe;
        for (Iterator<org.bukkit.inventory.Recipe> it = Bukkit.recipeIterator(); it.hasNext() ;  recipe = it.next())
        {

        }

lub


        for (Iterator<org.bukkit.inventory.Recipe> it = Bukkit.recipeIterator(); it.hasNext() 
        {
            Recipe recipe = it.next();
        }

drugie jest poprawniejsze

1438614356923701010629.png

 

Opublikowano

 

@AdamGrzegorz

 

juz sobie poradzilem, wystarczy ze przelecialem iteratorem po recepturach i usunalem ten, co chcialem a potem zarejestrowalem - jestem głupi :D

 

Kod, gdyby ktos chcial:

Iterator<Recipe> it = getServer().recipeIterator();
	Recipe recipe;
		while(it.hasNext()) {
				recipe = it.next();
					if (recipe != null && recipe.getResult().getType() == Material.WOOD)	{
						it.remove();
					}
			}
			planks();
}
		

private void planks(){
	ShapelessRecipe recipe = new ShapelessRecipe(new ItemStack(Material.WOOD, 4));
	recipe.addIngredient(Material.LOG);
	recipe.addIngredient(Material.GOLD_AXE);
	plugin.getServer().addRecipe(recipe);
	}

tylko jest kolejny problem - chce, zeby do jednego przerobienia np. 40 logow potrzeba byla tylko jedna siekierka, a nie 40

No to o tym mówiłem, tylko dlaczego Iterator zamiast prostej pętli for?

 

­

 

 

 

 

raczej nie widzi mi sie robienie warunku do każdej ilości, zbyt duzo tego by bylo

ogólnie w zwalonym API bukkita... nie zrobisz tego, musisz ręcznie w evencie od EQ/craftingu odejmować durability z toporka, np przerobienie 1 loga, pobiera 1 durability z siekierki.

 

 

 

@AdamGrzegorz

 

juz sobie poradzilem, wystarczy ze przelecialem iteratorem po recepturach i usunalem ten, co chcialem a potem zarejestrowalem - jestem głupi :D

 

Kod, gdyby ktos chcial:

Iterator<Recipe> it = getServer().recipeIterator();
	Recipe recipe;
		while(it.hasNext()) {
				recipe = it.next();
					if (recipe != null && recipe.getResult().getType() == Material.WOOD)	{
						it.remove();
					}
			}
			planks();
}
		

private void planks(){
	ShapelessRecipe recipe = new ShapelessRecipe(new ItemStack(Material.WOOD, 4));
	recipe.addIngredient(Material.LOG);
	recipe.addIngredient(Material.GOLD_AXE);
	plugin.getServer().addRecipe(recipe);
	}

tylko jest kolejny problem - chce, zeby do jednego przerobienia np. 40 logow potrzeba byla tylko jedna siekierka, a nie 40

No to o tym mówiłem, tylko dlaczego Iterator zamiast prostej pętli for?

 

­

 

bo metoda zwraca iterator, i w pętli for nie można usuwać elementów listy

Co najwyżej może to zmienić na:


        Recipe recipe;
        for (Iterator<org.bukkit.inventory.Recipe> it = Bukkit.recipeIterator(); it.hasNext() ;  recipe = it.next())
        {

        }

lub


        for (Iterator<org.bukkit.inventory.Recipe> it = Bukkit.recipeIterator(); it.hasNext() 
        {
            Recipe recipe = it.next();
        }

drugie jest poprawniejsze

 

@AdamGrzegorz

 

nie dokładnie zrozumiałem/załapałem o co chodzi, ale i tak naprowadziłeś mnie na ślad, także dzięki :D

 

dzięki wam jeszcze raz za pomoc, temat do zamknięcia.

 

 

 

 

fKJeAI4.jpg

 

 

 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...