Sol Reklam
Sağ Reklam

Rehber JAVA Minecraft-URL ile Kafa oluşturma | Minecraft Plugin Rehberi

Durum
Mesaj gönderimine kapalı.

HaktanOzkan

Demir Cevheri Gibiyim
Premium

Discord:

hktanozkan

Katılım
22 Temmuz 2014
Mesajlar
187
Elmaslar
100
Puanlar
13.775
Minecraft
HaktanOzkan
Hepinize merhaba :) Uzun zaman önce yaptığım bir eklenti vardı. Eklenti içerisinde minecraft oyuncularının kafalarını kullanmam gerekti. Bu yolu internette uzun araştırmam sonucunda bulmuştum. Tam olarak hangi siteden olduğunu hatırlamadığım için kaynak belirtemeyeceğim.

IDE : Eclipse Java

Öncelikle paketinizin içine bir enum tipi dosya oluşturuyorsunuz.
Ben bu dosyaya Skull adını verdim siz istediğiniz ismi koyabilirsiniz.

enumselect.png


skullname.png


Dosya oluşturulduktan sonra import etmeniz gereken bazı paketler var aşağıdaki paketleri import ediyorsunuz.

Java:
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import com.mojang.authlib.properties.PropertyMap;
import org.apache.commons.codec.binary.Base64;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.SkullMeta;

import java.util.UUID;

İmport edildikten sonra eğer enum tipi dosyayı sizde skull adı ile kaydettiyseniz hiçbir şey değiştirmeden direkt olarak yapıştırabilirsiniz. Eğer dosyanın ismini farklı bir şey yaptıysanız aşağıdaki kodta ( public enum Skull ) yazan kısımdaki Skull ismini belirlediğiniz isim ile değiştirin.

Java:
public enum Skull {
    ARROW_LEFT("MHF_ArrowLeft"),
    ARROW_RIGHT("MHF_ArrowRight"),
    ARROW_UP("MHF_ArrowUp"),
    ARROW_DOWN("MHF_ArrowDown"),
    QUESTION("MHF_Question"),
    EXCLAMATION("MHF_Exclamation"),
    CAMERA("FHG_Cam"),

    ZOMBIE_PIGMAN("MHF_PigZombie"),
    PIG("MHF_Pig"),
    SHEEP("MHF_Sheep"),
    BLAZE("MHF_Blaze"),
    CHICKEN("MHF_Chicken"),
    COW("MHF_Cow"),
    SLIME("MHF_Slime"),
    SPIDER("MHF_Spider"),
    SQUID("MHF_Squid"),
    VILLAGER("MHF_Villager"),
    OCELOT("MHF_Ocelot"),
    HEROBRINE("MHF_Herobrine"),
    LAVA_SLIME("MHF_LavaSlime"),
    MOOSHROOM("MHF_MushroomCow"),
    GOLEM("MHF_Golem"),
    GHAST("MHF_Ghast"),
    ENDERMAN("MHF_Enderman"),
    CAVE_SPIDER("MHF_CaveSpider"),

    CACTUS("MHF_Cactus"),
    CAKE("MHF_Cake"),
    CHEST("MHF_Chest"),
    MELON("MHF_Melon"),
    LOG("MHF_OakLog"),
    PUMPKIN("MHF_Pumpkin"),
    TNT("MHF_TNT"),
    DYNAMITE("MHF_TNT2");

    private static final Base64 base64 = new Base64();
    private String id;

    private Skull(String id) {
        this.id = id;
    }

    /**
     * Return a skull that has a custom texture specified by url.
     *
     * @param url skin url
     * @return itemstack
     */
    public static ItemStack getCustomSkull(String url, String name) {
        GameProfile profile = new GameProfile(UUID.randomUUID(), null);
        PropertyMap propertyMap = profile.getProperties();
        if (propertyMap == null) {
            throw new IllegalStateException("Profile doesn't contain a property map");
        }
        byte[] encodedData = base64.encode(String.format("{textures:{SKIN:{url:\"%s\"}}}", url).getBytes());
        propertyMap.put("textures", new Property("textures", new String(encodedData)));
        ItemStack head = new ItemStack(Material.SKULL_ITEM, 1, (short) 3);
        ItemMeta headMeta = head.getItemMeta();
        headMeta.addEnchant(Enchantment.DURABILITY, 5, true);
        headMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
        headMeta.addItemFlags(ItemFlag.HIDE_DESTROYS);
        headMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
        headMeta.addItemFlags(ItemFlag.HIDE_PLACED_ON);
        headMeta.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS);
        headMeta.addItemFlags(ItemFlag.HIDE_UNBREAKABLE);
        headMeta.setDisplayName(name);
        Class<?> headMetaClass = headMeta.getClass();
        Reflections.getField(headMetaClass, "profile", GameProfile.class).set(headMeta, profile);
        head.setItemMeta(headMeta);
        return head;
    }
   
    public static ItemStack getCustomSkullamount(String url, String name, int amount) {
        GameProfile profile = new GameProfile(UUID.randomUUID(), null);
        PropertyMap propertyMap = profile.getProperties();
        if (propertyMap == null) {
            throw new IllegalStateException("Profile doesn't contain a property map");
        }
        byte[] encodedData = base64.encode(String.format("{textures:{SKIN:{url:\"%s\"}}}", url).getBytes());
        propertyMap.put("textures", new Property("textures", new String(encodedData)));
        ItemStack head = new ItemStack(Material.SKULL_ITEM, amount, (short) 3);
        ItemMeta headMeta = head.getItemMeta();
        headMeta.addEnchant(Enchantment.DURABILITY, 5, true);
        headMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
        headMeta.addItemFlags(ItemFlag.HIDE_DESTROYS);
        headMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
        headMeta.addItemFlags(ItemFlag.HIDE_PLACED_ON);
        headMeta.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS);
        headMeta.addItemFlags(ItemFlag.HIDE_UNBREAKABLE);
        headMeta.setDisplayName(name);
        Class<?> headMetaClass = headMeta.getClass();
        Reflections.getField(headMetaClass, "profile", GameProfile.class).set(headMeta, profile);
        head.setItemMeta(headMeta);
        return head;
    }

    /**
     * Return a skull of a player.
     *
     * @param name player's name
     * @return itemstack
     */
    public static ItemStack getPlayerSkull(String name) {
        ItemStack itemStack = new ItemStack(Material.SKULL_ITEM, 1, (short) 3);
        SkullMeta meta = (SkullMeta) itemStack.getItemMeta();
        meta.setOwner(name);
        itemStack.setItemMeta(meta);
        return itemStack;
    }

    /**
     * Return the skull's id.
     *
     * @return id
     */
    public String getId() {
        return id;
    }

    /**
     * Return the skull of the enum.
     *
     * @return itemstack
     */
    public ItemStack getSkull() {
        ItemStack itemStack = new ItemStack(Material.SKULL_ITEM, 1, (short) 3);
        SkullMeta meta = (SkullMeta) itemStack.getItemMeta();
        meta.setOwner(id);
        itemStack.setItemMeta(meta);
        return itemStack;
    }

}

Maalesef işimiz burda bitmedi. Sırada başka bir dosya oluşturmak var. Ama endişelenicek bir şey yok. Hepsi çok kolay.
Hemen bir class tipi dosya oluşturuyoruz. Ben ismini Reflections olarak ayarladım siz tekrardan istediğiniz ismi koyabilirsiniz.

Her dosyada olduğu gibi bu dosyadada import etmemiz gereken paketler var. Hemen onları import edelim.

Java:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.bukkit.Bukkit;

İmport işlemi tamamlandığına göre artık kod kısmına geçebiliriz.
Koddaki Reflections yazan kısmı siz kendi belirlediğiniz isim ile değiştirmeniz gereklidir eğer sizde ismi Reflections olarak ayarladıysanız bir sorun çıkmayacaktır kodu direkt olarak yapıştırabilirsiniz.

Java:
public final class Reflections {
    // Deduce the net.minecraft.server.v* package
    private static String OBC_PREFIX = Bukkit.getServer().getClass().getPackage().getName();
    private static String NMS_PREFIX = OBC_PREFIX.replace("org.bukkit.craftbukkit", "net.minecraft.server");
    private static String VERSION = OBC_PREFIX.replace("org.bukkit.craftbukkit", "").replace(".", "");
    // Variable replacement
    private static Pattern MATCH_VARIABLE = Pattern.compile("\\{([^\\}]+)\\}");

    private Reflections() {
    }

    /**
     * Expand variables such as "{nms}" and "{obc}" to their corresponding packages.
     *
     * @param name the full name of the class
     * @return the expanded string
     */
    private static String expandVariables(String name) {
        StringBuffer output = new StringBuffer();
        Matcher matcher = MATCH_VARIABLE.matcher(name);

        while (matcher.find()) {
            String variable = matcher.group(1);
            String replacement;

            // Expand all detected variables
            if ("nms".equalsIgnoreCase(variable))
                replacement = NMS_PREFIX;
            else if ("obc".equalsIgnoreCase(variable))
                replacement = OBC_PREFIX;
            else if ("version".equalsIgnoreCase(variable))
                replacement = VERSION;
            else
                throw new IllegalArgumentException("Unknown variable: " + variable);

            // Assume the expanded variables are all packages, and append a dot
            if (replacement.length() > 0 && matcher.end() < name.length() && name.charAt(matcher.end()) != '.')
                replacement += ".";
            matcher.appendReplacement(output, Matcher.quoteReplacement(replacement));
        }
        matcher.appendTail(output);
        return output.toString();
    }

    /**
     * Retrieve a class by its canonical name.
     *
     * @param canonicalName the canonical name
     * @return the class
     */
    private static Class<?> getCanonicalClass(String canonicalName) {
        try {
            return Class.forName(canonicalName);
        } catch (ClassNotFoundException e) {
            throw new IllegalArgumentException("Cannot find " + canonicalName, e);
        }
    }

    /**
     * Retrieve a class from its full name.
     * <p/>
     * Strings enclosed with curly brackets such as {TEXT} will be replaced according
     * to the following table:
     * <p/>
     * <table border="1">
     * <tr>
     * <th>Variable</th>
     * <th>Content</th>
     * </tr>
     * <tr>
     * <td>{nms}</td>
     * <td>Actual package name of net.minecraft.server.VERSION</td>
     * </tr>
     * <tr>
     * <td>{obc}</td>
     * <td>Actual pacakge name of org.bukkit.craftbukkit.VERSION</td>
     * </tr>
     * <tr>
     * <td>{version}</td>
     * <td>The current Minecraft package VERSION, if any.</td>
     * </tr>
     * </table>
     *
     * @param lookupName the class name with variables
     * @return the looked up class
     * @throws IllegalArgumentException If a variable or class could not be found
     */
    public static Class<?> getClass(String lookupName) {
        return getCanonicalClass(expandVariables(lookupName));
    }

    /**
     * Search for the first publicly and privately defined constructor of the given name and parameter count.
     *
     * @param className lookup name of the class, see {@link #getClass(String)}
     * @param params    the expected parameters
     * @return an object that invokes this constructor
     * @throws IllegalStateException If we cannot find this method
     */
    public static ConstructorInvoker getConstructor(String className, Class<?>... params) {
        return getConstructor(getClass(className), params);
    }

    /**
     * Search for the first publicly and privately defined constructor of the given name and parameter count.
     *
     * @param clazz  a class to start with
     * @param params the expected parameters
     * @return an object that invokes this constructor
     * @throws IllegalStateException If we cannot find this method
     */
    public static ConstructorInvoker getConstructor(Class<?> clazz, Class<?>... params) {
        for (final Constructor<?> constructor : clazz.getDeclaredConstructors()) {
            if (Arrays.equals(constructor.getParameterTypes(), params)) {

                constructor.setAccessible(true);
                return new ConstructorInvoker() {
                    @Override
                    public Object invoke(Object... arguments) {
                        try {
                            return constructor.newInstance(arguments);
                        } catch (Exception e) {
                            throw new RuntimeException("Cannot invoke constructor " + constructor, e);
                        }
                    }
                };
            }
        }
        throw new IllegalStateException(String.format(
                "Unable to find constructor for %s (%s).", clazz, Arrays.asList(params)));
    }

    /**
     * Retrieve a class in the org.bukkit.craftbukkit.VERSION.* package.
     *
     * @param name the name of the class, excluding the package
     * @throws IllegalArgumentException If the class doesn't exist
     */
    public static Class<?> getCraftBukkitClass(String name) {
        return getCanonicalClass(OBC_PREFIX + "." + name);
    }

    /**
     * Retrieve a field accessor for a specific field type and name.
     *
     * @param target    the target type
     * @param name      the name of the field, or NULL to ignore
     * @param fieldType a compatible field type
     * @return the field accessor
     */
    public static <T> FieldAccessor<T> getField(Class<?> target, String name, Class<T> fieldType) {
        return getField(target, name, fieldType, 0);
    }

    /**
     * Retrieve a field accessor for a specific field type and name.
     *
     * @param className lookup name of the class, see {@link #getClass(String)}
     * @param name      the name of the field, or NULL to ignore
     * @param fieldType a compatible field type
     * @return the field accessor
     */
    public static <T> FieldAccessor<T> getField(String className, String name, Class<T> fieldType) {
        return getField(getClass(className), name, fieldType, 0);
    }

    /**
     * Retrieve a field accessor for a specific field type and name.
     *
     * @param target    the target type
     * @param fieldType a compatible field type
     * @param index     the number of compatible fields to skip
     * @return the field accessor
     */
    public static <T> FieldAccessor<T> getField(Class<?> target, Class<T> fieldType, int index) {
        return getField(target, null, fieldType, index);
    }

    /**
     * Retrieve a field accessor for a specific field type and name.
     *
     * @param className lookup name of the class, see {@link #getClass(String)}
     * @param fieldType a compatible field type
     * @param index     the number of compatible fields to skip
     * @return the field accessor
     */
    public static <T> FieldAccessor<T> getField(String className, Class<T> fieldType, int index) {
        return getField(getClass(className), fieldType, index);
    }

    // Common method
    private static <T> FieldAccessor<T> getField(Class<?> target, String name, Class<T> fieldType, int index) {
        for (final Field field : target.getDeclaredFields()) {
            if ((name == null || field.getName().equals(name)) && fieldType.isAssignableFrom(field.getType()) && index-- <= 0) {
                field.setAccessible(true);

                // A function for retrieving a specific field value
                return new FieldAccessor<T>() {
                    @SuppressWarnings("unchecked")
                    @Override
                    public T get(Object target) {
                        try {
                            return (T) field.get(target);
                        } catch (IllegalAccessException e) {
                            throw new RuntimeException("Cannot access reflection.", e);
                        }
                    }

                    @Override
                    public void set(Object target, Object value) {
                        try {
                            field.set(target, value);
                        } catch (IllegalAccessException e) {
                            throw new RuntimeException("Cannot access reflection.", e);
                        }
                    }

                    @Override
                    public boolean hasField(Object target) {
                        // target instanceof DeclaringClass
                        return field.getDeclaringClass().isAssignableFrom(target.getClass());
                    }
                };
            }
        }

        // Search in parent classes
        if (target.getSuperclass() != null)
            return getField(target.getSuperclass(), name, fieldType, index);
        throw new IllegalArgumentException("Cannot find field with type " + fieldType);
    }

    /**
     * Search for the first publicly and privately defined method of the given name and parameter count.
     *
     * @param className  lookup name of the class, see {@link #getClass(String)}
     * @param methodName the method name, or NULL to skip
     * @param params     the expected parameters
     * @return an object that invokes this specific method
     * @throws IllegalStateException If we cannot find this method
     */
    public static MethodInvoker getMethod(String className, String methodName, Class<?>... params) {
        return getTypedMethod(getClass(className), methodName, null, params);
    }

    /**
     * Search for the first publicly and privately defined method of the given name and parameter count.
     *
     * @param clazz      a class to start with
     * @param methodName the method name, or NULL to skip
     * @param params     the expected parameters
     * @return an object that invokes this specific method
     * @throws IllegalStateException If we cannot find this method
     */
    public static MethodInvoker getMethod(Class<?> clazz, String methodName, Class<?>... params) {
        return getTypedMethod(clazz, methodName, null, params);
    }

    /**
     * Search for the first publicly and privately defined method of the given name and parameter count.
     *
     * @param clazz  target class
     * @param method the method name
     * @return the method found
     */
    public static Method getMethodSimply(Class<?> clazz, String method) {
        for (Method m : clazz.getMethods()) if (m.getName().equals(method)) return m;
        return null;
    }

    /**
     * Retrieve a class in the net.minecraft.server.VERSION.* package.
     *
     * @param name the name of the class, excluding the package
     * @throws IllegalArgumentException If the class doesn't exist
     */
    public static Class<?> getMinecraftClass(String name) {
        return getCanonicalClass(NMS_PREFIX + "." + name);
    }

    /**
     * Search for the first publicly and privately defined method of the given name and parameter count.
     *
     * @param clazz      a class to start with
     * @param methodName the method name, or NULL to skip
     * @param returnType the expected return type, or NULL to ignore
     * @param params     the expected parameters
     * @return an object that invokes this specific method
     * @throws IllegalStateException If we cannot find this method
     */
    public static MethodInvoker getTypedMethod(Class<?> clazz, String methodName, Class<?> returnType, Class<?>... params) {
        for (final Method method : clazz.getDeclaredMethods()) {
            if ((methodName == null || method.getName().equals(methodName)) &&
                    (returnType == null) || method.getReturnType().equals(returnType) &&
                    Arrays.equals(method.getParameterTypes(), params)) {

                method.setAccessible(true);
                return new MethodInvoker() {
                    @Override
                    public Object invoke(Object target, Object... arguments) {
                        try {
                            return method.invoke(target, arguments);
                        } catch (Exception e) {
                            throw new RuntimeException("Cannot invoke method " + method, e);
                        }
                    }
                };
            }
        }
        // Search in every superclass
        if (clazz.getSuperclass() != null)
            return getMethod(clazz.getSuperclass(), methodName, params);
        throw new IllegalStateException(String.format(
                "Unable to find method %s (%s).", methodName, Arrays.asList(params)));
    }

    /**
     * Retrieve a class from its full name, without knowing its type on compile time.
     * <p/>
     * This is useful when looking up fields by a NMS or OBC type.
     * <p/>
     *
     * @param lookupName the class name with variables
     * @return the class
     * @see {@link #getClass()} for more information
     */
    public static Class<Object> getUntypedClass(String lookupName) {
        @SuppressWarnings({"rawtypes", "unchecked"})
        Class<Object> clazz = (Class<Object>) (Class) getClass(lookupName);
        return clazz;
    }

    public static <T> T newInstance(Class<T> type) {
        try {
            return type.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * An interface for invoking a specific constructor.
     */
    public interface ConstructorInvoker {
        /**
         * Invoke a constructor for a specific class.
         *
         * @param arguments the arguments to pass to the constructor.
         * @return the constructed object.
         */
        public Object invoke(Object... arguments);
    }

    /**
     * An interface for invoking a specific method.
     */
    public interface MethodInvoker {
        /**
         * Invoke a method on a specific target object.
         *
         * @param target    the target object, or NULL for a static method.
         * @param arguments the arguments to pass to the method.
         * @return the return value, or NULL if is void.
         */
        public Object invoke(Object target, Object... arguments);
    }

    /**
     * An interface for retrieving the field content.
     *
     * @param <T> field type
     */
    public interface FieldAccessor<T> {
        /**
         * Retrieve the content of a field.
         *
         * @param target the target object, or NULL for a static field
         * @return the value of the field
         */
        public T get(Object target);

        /**
         * Set the content of a field.
         *
         * @param target the target object, or NULL for a static field
         * @param value  the new value of the field
         */
        public void set(Object target, Object value);

        /**
         * Determine if the given object has this field.
         *
         * @param target the object to test
         * @return TRUE if it does, FALSE otherwise
         */
        public boolean hasField(Object target);
    }

}

Evet gerekli olan tüm kodlar artık pluginimizin içinde mevcut. Sıra geldi bunu kullanmaya. Sonuçta bunlar için boş yere uğraşmadık :)


Örneğin bir komut oluşturalım ve bunun üzerinden gidelim.

Java:
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
    if(cmd.getName().equalsIgnoreCase("verbanakafa")) {
       
    }
}

Komut içinde sender kısmını player olarak entegre edelim.
Java:
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
    Player p = (Player) sender;
    if(cmd.getName().equalsIgnoreCase("verbanakafa")) {
       
    }
}

Artık tamamen bitti. Gönlünüzce insanlara kafa dağatabilir veya farklı içerikler sunabilirsiniz.

Java:
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
    Player p = (Player) sender;
    if(cmd.getName().equalsIgnoreCase("verbanakafa")) {
        //Aşağıdaki kullanım şekli belirtilen Minecraft-URL si ile belirttiğiniz kafayı envantere almanızı sağlar.
        p.getInventory().addItem(Skull.getCustomSkull("http://textures.minecraft.net/texture/33906a8e09b4b8eae045ad70b83e1273bc1e717d1349f7fc99992a2271c91711", "§eMario Kafası"));
       
        //Aşağıdaki kullanım şekli yukarıdakinin aynısıdır sadece sonunda kaç adet verilmesi gerektiği belirtilir.
        p.getInventory().addItem(Skull.getCustomSkullamount("http://textures.minecraft.net/texture/33906a8e09b4b8eae045ad70b83e1273bc1e717d1349f7fc99992a2271c91711", "§eMario Kafası", 1));
       
        //Bu kullanım şekli belirtilen oyunucunun kafasının envantere gelmesini sağlar.
        p.getInventory().addItem(Skull.getPlayerSkull(p.getName()));
    }
}

Minecraft-URL sine nasıl ulaşıcağım diye soruyor gibisiniz.

Benim kullandığım siteyi aşağıya bırakıyorum. Aynı zamanda HeadDatabase eklentisinin orjinal sitesidir. HeadDatabase eklentisinde bulunan tüm kafalar aynı şekilde sitede yer almaktadır. İstediğiniz kafayı seçip en altta value kısmındaki kodu koplayıp yukarıdaki
kısmının "33906a8e09b4b8eae045ad70b83e1273bc1e717d1349f7fc99992a2271c91711" kodu ile değiştirerek istediğiniz kafayı alabilirsiniz.

Minecraft-URL lerine ulaşabileceğiniz site:


Umarım işinize yarmıştır. Hepinize iyi günler diliyorum.
 
Son düzenleme:

Jeuiliz

Somon Balığı Selam Vermeye Geldi

Discord:

Jeuiliz#6425

Katılım
12 Ocak 2021
Mesajlar
11
Elmaslar
3
Puanlar
2.215
Minecraft
Blackfish_
Eline sağlık ?
 

HaktanOzkan

Demir Cevheri Gibiyim
Premium

Discord:

hktanozkan

Katılım
22 Temmuz 2014
Mesajlar
187
Elmaslar
100
Puanlar
13.775
Minecraft
HaktanOzkan

Ravolt

Elmas Güneş Gibi Parıldıyor
Emektar

Discord:

Ravolt#8521

Katılım
20 Ocak 2019
Mesajlar
619
Elmaslar
489
Puanlar
12.305
Yer
İstanbul
Minecraft
Ravolt
Eline, emeğine, koluna sağlık. Gayet güzel bir paylaşım olmuş. Bu tarz bilgilendirici içeriklerin devamını bekliyoruz ?
 

why_shiro

Aerospace Nerd
Emekli

Discord:

why_shiro

Katılım
3 Haziran 2019
Mesajlar
235
Elmaslar
252
Puanlar
7.295
Yaş
22
Yer
Türkiye
Discord İzni
Minecraft
GrimOK
Twitter
whyshiro_
Java bilmeyenlerin işkence çekeceği, bilenlerin de yine işkence çekeceği bir çalışma olmuş :D Umarım Java bilmeyen birileri bundan sonuç çıkarmayı beklemiyordur :D Yine de bilmediğim şeyler öğrendim. Ellerinize sağlık.​
 

HaktanOzkan

Demir Cevheri Gibiyim
Premium

Discord:

hktanozkan

Katılım
22 Temmuz 2014
Mesajlar
187
Elmaslar
100
Puanlar
13.775
Minecraft
HaktanOzkan
Eline, emeğine, koluna sağlık. Gayet güzel bir paylaşım olmuş. Bu tarz bilgilendirici içeriklerin devamını bekliyoruz ?
Teşekkür ederim . Yeni ve yararlı şeyler öğrendikçe paylaşmaya çalışırım tabii ?
Java bilmeyenlerin işkence çekeceği, bilenlerin de yine işkence çekeceği bir çalışma olmuş :D Umarım Java bilmeyen birileri bundan sonuç çıkarmayı beklemiyordur :D Yine de bilmediğim şeyler öğrendim. Ellerinize sağlık.​
Aslında o kadar zor bir kısmı yok ? Biraz temel bilgi yeterli olur diye düşündüm zaten senin yazman gereken 2-3 satır kod var ?
 
Durum
Mesaj gönderimine kapalı.
Neden altınlarını Discord sunucumuzda kazmıyorsun? TIKLA VE KATIL!
Yukarı