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

[Plugin] Autorski plugin na Rzucane TnT!


Gość

Rekomendowane odpowiedzi

  • Marosking zmienił(a) tytuł na [Plugin] Autorski plugin na Rzucane TnT!
Opublikowano
 e.setCancelled(true);
        p.getInventory().removeItem(new ItemStack[] { Util.throwntnt2 });
        p.updateInventory();
        final TNTPrimed tnt = (TNTPrimed)p.getWorld().spawn(e.getClickedBlock().getLocation(), (Class)TNTPrimed.class);
        tnt.setVelocity(new Vector(p.getVelocity().getX(), 0.5, p.getVelocity().getZ()));

Polecam jeśli chcecie mieć po 14 TPS na serwerze.

@edit

(plis admin nie banuj)

Nie chce tu nikogo obrażać czy coś ale plugin napisany tragicznie, łatwo jest zbugować to tnt. Nie wiem po co ludzie publikują takie chujowe pluginy

@AdamGrzegorz wypowiedz się na temat tego pluginu xD 

Opublikowano

A nie ma czasem już takiej komendy w jednym z podstawowych pluginów? (Nie pamiętam nazwy, bo nie gram w minkrufta)

Opublikowano
1 godzinę temu, Zimmex129 napisał:

 e.setCancelled(true);
        p.getInventory().removeItem(new ItemStack[] { Util.throwntnt2 });
        p.updateInventory();
        final TNTPrimed tnt = (TNTPrimed)p.getWorld().spawn(e.getClickedBlock().getLocation(), (Class)TNTPrimed.class);
        tnt.setVelocity(new Vector(p.getVelocity().getX(), 0.5, p.getVelocity().getZ()));

Polecam jeśli chcecie mieć po 14 TPS na serwerze.

@edit

(plis admin nie banuj)

Nie chce tu nikogo obrażać czy coś ale plugin napisany tragicznie, łatwo jest zbugować to tnt. Nie wiem po co ludzie publikują takie chujowe pluginy

@AdamGrzegorz wypowiedz się na temat tego pluginu xD 

Po 0 tps od razu. Skoro twierdzisz, że łatwo zbugować to powiedz jak, tak samo powiedz co ci nie pasuje w tej czesci kodu zamiast pieprzyć kocopoły. Gówno się znasz ale i tak się wypowiesz.

 

Opublikowano

@Vosly_

Zapoznaj się najpierw z działaniem tego pluginu i dopiero później się wypowiadaj.

 

@Zimmex129

Już jak testowałem plugin to na serwerze były tps'y na minusie 

Opublikowano
2 godziny temu, xDGWG napisał:

@Vosly_

Zapoznaj się najpierw z działaniem tego pluginu i dopiero później się wypowiadaj.

 

@Zimmex129

Już jak testowałem plugin to na serwerze były tps'y na minusie 

No widzicie przyznał się, plugin laguje sewer.

2 godziny temu, __AHA__ napisał:

Po 0 tps od razu. Skoro twierdzisz, że łatwo zbugować to powiedz jak, tak samo powiedz co ci nie pasuje w tej czesci kodu zamiast pieprzyć kocopoły. Gówno się znasz ale i tak się wypowiesz.

 

Podałem kawałek kodu który mi nie pasuje. Nie tylko mi każdy poważny programista wyśmieje xDGWG.

Nie będę wam ułatwiał sprawy sami domyślcie się jak zbugować to tnt xD Bardzo łatwo

Opublikowano
15 godzin temu, Zimmex129 napisał:

No widzicie przyznał się, plugin laguje sewer.

Podałem kawałek kodu który mi nie pasuje. Nie tylko mi każdy poważny programista wyśmieje xDGWG.

Nie będę wam ułatwiał sprawy sami domyślcie się jak zbugować to tnt xD Bardzo łatwo

Ale wiesz ze on z sarkazmem napisał 'mam tpsy na minusie'?

A jak tak bardzo ci przeszkadza kod to napisz co do poprawy, a ja chetnie zobacze co takiego ciekawego, poza tym jak masz takie problemy z wybuchami na serwerze to może czas zoptymalizować silnik? (mowie tutaj o konfiguracji)

 

Co do pluginu: czekam na dodanie projektu na jakiegoś gita ;) W taki sposób nikt ci nie oceni kodu, no chyba ,że ten smieszny Zimmex

Opublikowano

hmm. A co jeśli ktoś będzie chciał zrobić, żeby np w jednym slocie miało być np. 15tnt ?? 

i nie ma to jak boolean'a sprawdzać przez "get" i polecam sprawdzić różnice pomiędzy Boolean a boolean 

    public static Boolean getActive() {
        return ConfigManager.active;
    }

Obiekty powinny być finalne albo prywatne i zrobić metode get, a nie pobierać prosto ze zmiennej

    public static ItemStack throwntnt;
    public static ItemStack throwntnt2;
    public static ShapedRecipe recipe;

 

Opublikowano

Dzięki stary! Już sobie dopisuje ten kawałek kodu do mojego super LUL-CORE i ide go sprzedawać na serwery z enderchestem, izi zarobek siema siema zwijam się.

Pomogłem? Daj like ;)

  • 2 tygodnie później...
Opublikowano
Dnia 19.04.2018 o 16:02, Zimmex129 napisał:

 e.setCancelled(true);
        p.getInventory().removeItem(new ItemStack[] { Util.throwntnt2 });
        p.updateInventory();
        final TNTPrimed tnt = (TNTPrimed)p.getWorld().spawn(e.getClickedBlock().getLocation(), (Class)TNTPrimed.class);
        tnt.setVelocity(new Vector(p.getVelocity().getX(), 0.5, p.getVelocity().getZ()));

Polecam jeśli chcecie mieć po 14 TPS na serwerze.

@edit

(plis admin nie banuj)

Nie chce tu nikogo obrażać czy coś ale plugin napisany tragicznie, łatwo jest zbugować to tnt. Nie wiem po co ludzie publikują takie chujowe pluginy

@AdamGrzegorz wypowiedz się na temat tego pluginu xD 

Az wypowiem sie drugi raz bo nie moge patrzyc na to jakie glupoty piszesz pajacu ;/

Niby czemu ma miec po 14 tps? Chujowe pluginy? Z tego co ja widzialem, 2-3 dni temu dales swoj kod gdzies - porazka, wiec nie wiem czemu komentujesz skoro sam gowno potrafisz ;) 

 

Co do samego tematu:

Brak wsparcia dla wersji nizszych, wyzszych

Cytat

import org.bukkit.craftbukkit.v1_8_R3.entity.*;
import net.minecraft.server.v1_8_R3.*;

lub jezeli serwer nie uzywa spigota ;/

Masz tu kawalek kodu do title, przykladowe:

Tworzysz sobie interfejs - TitleAPI, dajesz tam wszystkie wymagane metody typu sendTitle, w konstruktorach playera i text, tworzysz klase, np. TitleAPI_1_8, implementujesz titleapi, tworzysz ciala metod :D 

gdziekolwiek dajesz interfejs TitleAPI jako fielda oraz gettera do niego i potem tylko plugin.getTitleAPI().sendTitle..

 

package xyz.yooniks.drop.api.title;

import org.bukkit.entity.Player;

public interface TitleAPI {

    void sendTitle(Player player, String text);

    void sendSubTitle(Player player, String text);

    void sendActionBar(Player player, String text);

}
package xyz.yooniks.drop.api.title;

import net.minecraft.server.v1_8_R3.IChatBaseComponent;
import net.minecraft.server.v1_8_R3.PacketPlayOutChat;
import net.minecraft.server.v1_8_R3.PacketPlayOutTitle;
import org.bukkit.ChatColor;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.entity.Player;

public class TitleAPI_v1_8_R3 implements TitleAPI {

    @Override
    public void sendTitle(Player player, String text) {
        final IChatBaseComponent chatTitle = IChatBaseComponent.ChatSerializer.a("{\"text\": \""
                + text + "\",color:" + ChatColor.GOLD.name().toLowerCase() + "}"); //gold color?

        final PacketPlayOutTitle title = new PacketPlayOutTitle(PacketPlayOutTitle.EnumTitleAction.TITLE, chatTitle);
        final PacketPlayOutTitle length = new PacketPlayOutTitle(12, 32, 12);


        ((CraftPlayer) player).getHandle().playerConnection.sendPacket(title);
        ((CraftPlayer) player).getHandle().playerConnection.sendPacket(length);
    }

    @Override
    public void sendActionBar(Player player, String text) {
        final PacketPlayOutChat packet = new PacketPlayOutChat(IChatBaseComponent.
                ChatSerializer.a("{\"text\":\"" + text + "\"}"), (byte) 2); //default color?
        ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet);
    }

    @Override
    public void sendSubTitle(Player player, String text) {
        final IChatBaseComponent chatTitle = IChatBaseComponent.ChatSerializer.a("{\"text\": \""
                + text + "\",color:" + ChatColor.GOLD.name().toLowerCase() + "}"); //gold color?

        final PacketPlayOutTitle title = new PacketPlayOutTitle(PacketPlayOutTitle.EnumTitleAction.SUBTITLE, chatTitle);
        final PacketPlayOutTitle length = new PacketPlayOutTitle(12, 32, 32);


        ((CraftPlayer) player).getHandle().playerConnection.sendPacket(title);
        ((CraftPlayer) player).getHandle().playerConnection.sendPacket(length);
    }
}
    @Getter //kto co woli
    private TitleAPI titleAPI;
    @Override
    public void onEnable() {
        this.setupTitleAPI();
    private void setupTitleAPI() {
        final String version;
        try {
            version = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
        } catch (ArrayIndexOutOfBoundsException ex) {
            logger.warning("Error during setup title api, using unsupported version..");
            logger.exception(ex.getCause());
            this.titleAPI = new UnsupportedTitleAPI();
            return;
        }
        logger.info("Server is running on: " + version + " NMS version");
        if (version.equals("v1_8_R3")) {
            titleAPI = new TitleAPI_v1_8_R3();
            logger.info("Server is using TitleAPI_v1_8_R3..");
        } else {
            titleAPI = new UnsupportedTitleAPI();
            logger.warning("Server is using unsupported version! TitleAPI won't work!");
        }
    }

wow, gotowe.

 


public class TntCommand implements CommandExecutor
{
    public boolean onCommand(final CommandSender sender, final Command cmd, final String label, final String[] args) {
        final Player p = (Player)sender;
        if (!(sender instanceof Player)) {
            return false;
        }
        if (!p.hasPermission("xdgwg.tnt")) {
            Util.sendMessage(sender, ConfigManager.getMsg());
            return false;
        }
        p.getInventory().addItem(new ItemStack[] { Util.throwntnt });
        return false;
    }
}

a co jezeli chcesz dac graczowi tnt przez konsole, lub okreslona ilosc tego tnt? ;/

p.getInventory().removeItem(new ItemStack[] { Util.throwntnt2 });

nie rozumiem po co tutaj te tablice

 

no ale kazdy jakos zaczyna ;v

Dnia 21.04.2018 o 01:01, TheMajster napisał:

hmm. A co jeśli ktoś będzie chciał zrobić, żeby np w jednym slocie miało być np. 15tnt ?? 

i nie ma to jak boolean'a sprawdzać przez "get" i polecam sprawdzić różnice pomiędzy Boolean a boolean 


    public static Boolean getActive() {
        return ConfigManager.active;
    }

Obiekty powinny być finalne albo prywatne i zrobić metode get, a nie pobierać prosto ze zmiennej


    public static ItemStack throwntnt;
    public static ItemStack throwntnt2;
    public static ShapedRecipe recipe;

 

jak mają być finalne skoro są statyczne, a nadaje im wartość w metodzie statycznej, load?

Cytat

i nie ma to jak boolean'a sprawdzać przez "get" i polecam sprawdzić różnice pomiędzy Boolean a boolean 


    public static Boolean getActive() {
        return ConfigManager.active;
    }

 

Cytat

i nie ma to jak boolean'a sprawdzać przez "get"

nie rozumiem, ale ok.

Cytat

Boolean a boolean 

zamiast mu tak pisac mozesz od razu napisac czym sie rozni obiektowe boolean od typu primitywnego, no ale ty tez pewnie nie rozumeisz skoro sam u siebie w dropie tego uzywasz ;D No ale co spodziewac sie po osobie ktora chce laczyc dwa stringi stringbuilderem lub uzywa stringbuildera do tego:

            Statement stat = conn.createStatement();
            StringBuilder sb = new StringBuilder();
            sb.append("UPDATE " + ConfigUtil.getDatabaseNameTableUser()+" ");
            sb.append("SET name = '"+u.getName()+"', ");
            sb.append("lvl = '"+u.getLvl()+"', ");
            sb.append("exp = '"+u.getExp()+"', ");
            sb.append("expireTimeDrop = '"+u.getExpireTimeDrop()+"', ");
            sb.append("expireTimeExp = '"+u.getExpireTimeExp()+"', ");
            sb.append("cobble = '"+(u.isCobble() ? 1 : 0)+"' ");
            sb.append("WHERE uuid = '"+u.getUuid()+ "';");
            stat.executeUpdate(sb.toString());

injections, tez radze poczytac ;d

albo nie wie co to try-with-resources lub tak pieknie obsluguje wyjatki i nazywa metody:

    public void dissconnect() {
        try {
            conn.close();
        } catch (Exception e) {
            System.err.println("[MDrop] [MySQL] Error disconnect " + e.getMessage());
        }
    }

oh, i chyba nie wie ze takie akcje powinien robic async, a bynajmniej nie w glownym watku serwera ;/

public void createUser(Player p){
        if(conn == null) new MySQL();
        try {
            Statement stat = conn.createStatement();
            StringBuilder sb = new StringBuilder();
            sb.append("INSERT INTO "+ ConfigUtil.getDatabaseNameTableUser());
            sb.append(" (uuid, name, lvl, exp, expireTimeDrop, expireTimeExp, cobble) VALUES (");
            sb.append("'" + p.getUniqueId() + "', ");
            sb.append("'" + p.getName() + "', ");
            sb.append("'" + 0 + "', ");
            sb.append("'" + 0 + "', ");
            sb.append("'" + System.currentTimeMillis() + "', ");
            sb.append("'" + System.currentTimeMillis() + "', ");
            sb.append("'" + 1 + "');");
            stat.executeUpdate(sb.toString());
            stat.close();
            if(ConfigUtil.isDatabaseCloseConnectionAfterAction()){
                dissconnect();
            }
        } catch (Exception e) {
        System.out.println("[MDrop] [MySQL] Error add record " + e.getMessage());
        }
    }

bo same te laczenie stringbuilderem troche zajmuje ;)

 

polecam tez poczytac o hikari i preparedstatement ;)

no ale przeciez to ty jestes tu programista ;/

Opublikowano
Cytat

 

zamiast mu tak pisac mozesz od razu napisac czym sie rozni obiektowe boolean od typu primitywnego, no ale ty tez pewnie nie rozumeisz skoro sam u siebie w dropie tego uzywasz ;D No ale co spodziewac sie po osobie ktora chce laczyc dwa stringi stringbuilderem lub uzywa stringbuildera do tego:


            Statement stat = conn.createStatement();
            StringBuilder sb = new StringBuilder();
            sb.append("UPDATE " + ConfigUtil.getDatabaseNameTableUser()+" ");
            sb.append("SET name = '"+u.getName()+"', ");
            sb.append("lvl = '"+u.getLvl()+"', ");
            sb.append("exp = '"+u.getExp()+"', ");
            sb.append("expireTimeDrop = '"+u.getExpireTimeDrop()+"', ");
            sb.append("expireTimeExp = '"+u.getExpireTimeExp()+"', ");
            sb.append("cobble = '"+(u.isCobble() ? 1 : 0)+"' ");
            sb.append("WHERE uuid = '"+u.getUuid()+ "';");
            stat.executeUpdate(sb.toString());

 

:l przeciez nawet gdy łączysz 2 stringi za pomocą '+' np "String" + "String" to i tak jest wywoływany StringBuilder :L wiec co w tym zlego ?

no a roznica miedzy Boolean a boolean ? ? to tak typ prymitywny to typ prymitywny i zajmuje miej miejsca w pamieci a typ oslonowy Boolean zajmuje więcej bo jest obiektem ktory jest wskaznikiem na boolean a co za tym idzie zajmuje więcej miejsca i może przyjąć wartość null, moze byc cos wiecej ale nigdy nie zglebialem tematu

 

Opublikowano
4 godziny temu, damianq20 napisał:

:l przeciez nawet gdy łączysz 2 stringi za pomocą '+' np "String" + "String" to i tak jest wywoływany StringBuilder :L wiec co w tym zlego ?

no a roznica miedzy Boolean a boolean ? ? to tak typ prymitywny to typ prymitywny i zajmuje miej miejsca w pamieci a typ oslonowy Boolean zajmuje więcej bo jest obiektem ktory jest wskaznikiem na boolean a co za tym idzie zajmuje więcej miejsca i może przyjąć wartość null, moze byc cos wiecej ale nigdy nie zglebialem tematu

 

em, 1. do mysql uzywa sie preparedstatement aby uniknac sqlinjections 

2. a tym bardziej nie uzywa sie stringbuildera bo to jest wolne w takim czyms, na pewno jest roznica jezeli polaczy to stringbuilderem a zrobi normalnie, np:

String update = "..." + p.getName() + " ...";

StringBuilder stupidUpdate = new StringBuilder();
stupidUpdate.append("... ");
stupidUpdate.append(p.getName());
stupidUpdate.append(" ...");

//no napewno jakas roznica w szybkosci jest

 

Opublikowano
1 godzinę temu, toWcaleNieOn_;/ napisał:

em, 1. do mysql uzywa sie preparedstatement aby uniknac sqlinjections 

2. a tym bardziej nie uzywa sie stringbuildera bo to jest wolne w takim czyms, na pewno jest roznica jezeli polaczy to stringbuilderem a zrobi normalnie, np:


String update = "..." + p.getName() + " ...";

StringBuilder stupidUpdate = new StringBuilder();
stupidUpdate.append("... ");
stupidUpdate.append(p.getName());
stupidUpdate.append(" ...");

//no napewno jakas roznica w szybkosci jest

 

przeciez nic nie napisal  o preparedstatement lul.. Oczywiscie jest prawda to co napisales ze uzywa sie tego aby uniknac sqlinjections ale w przypadku ktory podales uzytkownik nie jest w stanie nic zrobic

Opublikowano

nie powinno byc zadnej  , powtórze gdy "dodajesz" stringi JVM korzysta z StringBuilder

Cytat

em, 1. do mysql uzywa sie preparedstatement aby uniknac sqlinjections 

tego akurat nie wiedzialem :< , pewno dlatego ze nigdy mi to nie wykrzaczyło

Cytat

Obiekty powinny być finalne albo prywatne i zrobić metode get, a nie pobierać prosto ze zmiennej


    public static ItemStack throwntnt;
    public static ItemStack throwntnt2;
    public static ShapedRecipe recipe;

nie ucz durnot, jesli chcesz pisać poprawny politycznie kod to (glowne zalożenia chyba wszystkie )

- wszystkie zmienne w klasie powinny byc prywatne (z uwagi na obiektowość języka), a dostep do nich poprzez metody <- ogolnie nie powinien to byc dostep typu get a jedynie metody do manipulacji tymi zmiennymi ale to malo istotne

- Wszystko po angjelsku

- nazwy klas z wielkiej , metod z malej oraz get/set/is jako przedrostki do manipulacji/dostępu do zmiennej

- unikac statykow , a korzystac z obiektow i cudow jakie niosa w postaci np. dziedziczenia

robienie zmiennych publicznych nie jest bledem , o ile kod dziala i robi to co ma robic , jest natomiast niepoprawny jesli chodzi o konwencje w jakiej pisze sie w java , ale nie jest to blad , takich sytuacji powinno sie unikac jesli mozna ale nie zawsze tego chcemy , czasami tak ma byc i koniec

to tylko tyle nie ma tam nic o finalach , nie jest to błąd aby pchac wszędzie gdzie sie da finale ale akurat w zmiennych jest to po prostu informacja ze dane pole po zainicjowaniu NIE MOZE BYC ZMIENIONE !, prosty przyklad masz klase z 100 zmiennych , i niektore z tych zmiennych sa stale niezmienne oraz masz do nich dostęp z bo so protected lub nawet public ...

stawianie finali w zmiennych ma sens (jesli mowa o metodach) gdy tworzymy klasy zagniezdzone w tej metodzie wtedy sa one wymagane , aby miec wglad na zmienna ,

poza tym finale niec nie zmieniaja (jesli mowa o zmiennych) ,

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...