java10
kız çava bana kahve yap
- Mesajlar
- 513
- En iyi cevaplar
- 0
- Beğeniler
- 586
- Puanları
- 1,090
- Ruh hali
önceki dersimde on enable ve on disable a kadar geldik ve .jar ımızı oluşturmuştuk şimdi bir kaç api yazıcaz bunlar minigames yazarken çok işimize yarıycak apiler olacak,
belki başınıza gelmiştir diye bunu veriyorum bu kolayca listenerları kaydetmenize yarıycak peki bu olmadan nasıl yapıyorduk;
getServer().getPluginManager().registerEvents(this, new ListenerNeyseArtık());
ee bu kodu kullanırsak nasıl yazıcaz;
dinleyicilerikaydet(this, new ListenerNeyse(), new DiğerBirListener(), new Baska(), new BLaba(), new BaşkalarıdaVar());
gibi işimizi kolaylaştırıcaktır ilk this yazmamın sebebi methodu incelerseniz ilk değerin Pluginin yani main class ın yerini belirtmenizi istiyor ilk dersimizde söylediğim extends JavaPlugin yaptığımız class ımızı yazıyoruz, bu kodu main class a da koyabilirsiniz isteyen istediği yere koyar eee peki api classına koyarsam nasıl "this" yazıcam onun içinse şöyle bir kod vereyim,
bu kod ana classınızı getPlugin() yaparak içindeki public verilerine rahatça erişmenizi sağlar instance denen lanet şey ile uğraşmak zorunda kalmazsınız peki dinleyicileri nasıl yazıcam buna,
şeklinde, AnaClass.getPlugin() bunun anlamı main class ta "this" in anlamı ile aynıdır class ı seçer
minigameslerde en önemli şeylerden biri görsellik bunun içinse güzel apilerimiz var
Benden bu kadar diğer konumda görüşmek dileğiyle
(resimler, yazılar ve kodlar bana aittir alıntı yapabilirsiniz)
(konu biraz uzun ama okuyunca düşünsene sende minigames yazabiliceksin)
Etiketler: @KilllerDragons , @S4RP , @Za_ion101 , @Elfen , @Atomy , @Onurbey034 , @Spygrand , @ByAehn , @GodofMilker , @Frodox , @ShortPallMall , @MCTDark
öncelikle haritaları ve oyuncu bilgilerini kaydetmemiz(save/load) için oos ois ten yararlanacağız kullanımı basittir,
bu kodu isterseniz açacağınız api package ine koyabilirsiniz ya da düz çalışmak istiyorsanız her şeyi tek class ta yapabilirsiniz(önerilmez)
Kod:
public static <T> void save(T obj, String path) throws Exception {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
oos.writeObject(obj);
oos.flush();
oos.close();
}
public static <T> T load(String path)throws Exception {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
T result = (T) ois.readObject();
ois.close();
return result;
}
başka ufak bir api;
bu p.sendMessage(ChatColor.Green + "selam" + ChatColor.GOLD + " nasılsın?"); gibi uzun yazılardan kurtarım buna dönüştürücek: p.sendMessage(API.chatcolor("&aSelam nasılsın?")); & bunu oyunda kullandığımız gibi kullanabilicez uzun ve fazla renkli cümlelerde işimize yarıycaktır bu koduda api class ınıza atabilirsiniz
Kod:
public static String chatcolor(String s){
return ChatColor.translateAlternateColorCodes('&', s);
}
Kod:
public static void dinleyicilerikaydet(Plugin p, Listener... listeners){
Arrays.stream(listeners).forEach(listener -> Bukkit.getPluginManager().registerEvents(listener,p));
}
getServer().getPluginManager().registerEvents(this, new ListenerNeyseArtık());
ee bu kodu kullanırsak nasıl yazıcaz;
dinleyicilerikaydet(this, new ListenerNeyse(), new DiğerBirListener(), new Baska(), new BLaba(), new BaşkalarıdaVar());
gibi işimizi kolaylaştırıcaktır ilk this yazmamın sebebi methodu incelerseniz ilk değerin Pluginin yani main class ın yerini belirtmenizi istiyor ilk dersimizde söylediğim extends JavaPlugin yaptığımız class ımızı yazıyoruz, bu kodu main class a da koyabilirsiniz isteyen istediği yere koyar eee peki api classına koyarsam nasıl "this" yazıcam onun içinse şöyle bir kod vereyim,
Kod:
public static AnaClassİsmi getPlugin(){
return (AnaClassİsmi)Bukkit.getPluginManager().getPlugin("Plugininizinİsmi");
}
Kod:
dinleyicilerikaydet(AnaClass.getPlugin(), new Test1(), new Test12(), new Test13());
gelelim configapi mize bunu ben çok kullanıyorum sizede tavsiye ederim,
bu apiyi nasıl kullanabilirim;
öncelikle main classınıza oluşturacağınız özel config i belirtmemiz gerekiyor,
bu kodu main classın üst taraflarına doğru atalım ve on enable a yazmamız gereken şeyleri yazalım;
"this" yazmamın sebebi kodun main class ta olması ama siz anaclass.getPlugin() de yapabilirisiniz(başka bir class ta tutuyorsanız config listesini)
Kod:
public class ConfigAPI {
private File file = null;
private FileConfiguration fileConfiguration = null;
public ConfigAPI(String s, Plugin p){
file = new File(p.getDataFolder(), s + ".yml");
fileConfiguration = YamlConfiguration.loadConfiguration(file);
saveFile();
}
public Object get(String path){
return getConfig().get(path);
}
public void set(String path, Object o){
getConfig().set(path,o);
saveFile();
}
public FileConfiguration getConfig(){
if (fileConfiguration == null){
loadFile();
}
return fileConfiguration;
}
public void saveFile(){
try {
getConfig().save(file);
}catch (IOException e){}
}
public void loadFile(){
if (file.exists()){
try {
getConfig().load(file);
}catch (IOException | InvalidConfigurationException e){}
}else{
saveFile();
}
}
public void createSection(String s) {
fileConfiguration.createSection(s);
saveFile();
}
public ConfigurationSection getConfigurationSection(String path){
return getConfig().getConfigurationSection(path);
}
}
öncelikle main classınıza oluşturacağınız özel config i belirtmemiz gerekiyor,
Kod:
public ConfigAPI configismimiz;
Kod:
configismimiz= new ConfigAPI("dosyamızınismi", this);
minigameslerde en önemli şeylerden biri görsellik bunun içinse güzel apilerimiz var
scoreboardapi:
scoreboard apimiz bu şekilde nasıl kullanılır;
bunu timer a koyarsanız sürekli featherboard gibi güncellenecektir "flash" sorunu yoktur, peki ben bu sınırsız kalıyor ise nasıl silicem;
bu kod ile scoreboard u silebilirsiniz.
bu şekilde kullanılıyor peki görüntüsü nasıl;
Kod:
public class ScoreBoardAPI {
private Scoreboard scoreboard;
private String title;
private Map<String, Integer> scores;
private List<Team> teams;
public ScoreBoardAPI(String title) {
this.scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
this.title = title;
this.scores = Maps.newLinkedHashMap();
this.teams = Lists.newArrayList();
}
public void blankLine() {
add(" ");
}
public void add(String text) {
add(text, null);
}
public void add(String text, Integer score) {
Preconditions.checkArgument(text.length() < 48, "text cannot be over 48 characters in length");
text = fixDuplicates(text);
scores.put(text, score);
}
private String fixDuplicates(String text) {
while (scores.containsKey(text))
text += "§r";
if (text.length() > 48)
text = text.substring(0, 47);
return text;
}
private Map.Entry<Team, String> createTeam(String text) {
String result = "";
if (text.length() <= 16)
return new AbstractMap.SimpleEntry<>(null, text);
Team team = scoreboard.registerNewTeam("text-" + scoreboard.getTeams().size());
Iterator<String> iterator = Splitter.fixedLength(16).split(text).iterator();
team.setPrefix(iterator.next());
result = iterator.next();
if (text.length() > 32)
team.setSuffix(iterator.next());
teams.add(team);
return new AbstractMap.SimpleEntry<>(team, result);
}
public void build() {
Objective obj = scoreboard.registerNewObjective((title.length() > 16 ? title.substring(0, 15) : title), "dummy");
obj.setDisplayName(title);
obj.setDisplaySlot(DisplaySlot.SIDEBAR);
int index = scores.size();
for (Map.Entry<String, Integer> text : scores.entrySet()) {
Map.Entry<Team, String> team = createTeam(text.getKey());
Integer score = text.getValue() != null ? text.getValue() : index;
OfflinePlayer player = Bukkit.getOfflinePlayer(team.getValue());
if (team.getKey() != null)
team.getKey().addPlayer(player);
obj.getScore(player).setScore(score);
index -= 1;
}
}
public void reset() {
title = null;
scores.clear();
for (Team t : teams)
t.unregister();
teams.clear();
}
public Scoreboard getScoreboard() {
return scoreboard;
}
public void send(Player... players) {
for (Player p : players)
p.setScoreboard(scoreboard);
}
}
Kod:
ScoreboardsAPI score = new ScoreboardsAPI(chatcolor("&aTest Title"));
score.add(chatcolor("&eTest Scoreboard 1. Satır"));
score.add(chatcolor("&eTest Scoreboard 2. Satır"));
score.build();
score.send(player, başkaoyuncu, diğeroyuncular, başkaoyuncuvarsa, otherplayer);
Kod:
score.reset();
bu şekilde kullanılıyor peki görüntüsü nasıl;
titleapi;
kod bu şekilde apimiz nasıl kullanılır;
bu şekilde kullanılıyor anlamını yazıyım;
ilk 30: title ın ekrana giriş zamanı
600: title ın ekranda durma süresi
ikinci 30: title ın ekrandan koybolma zamanı
peki ekranda olan title ı nasıl silebilirim;
bu şekildede ekranda olan title siliniyor.
Kod:
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import java.lang.reflect.Constructor;
public class TitleAPI {
public static void sendPacket(Player player, Object packet) {
try {
Object handle = player.getClass().getMethod("getHandle").invoke(player);
Object playerConnection = handle.getClass().getField("playerConnection").get(handle);
playerConnection.getClass().getMethod("sendPacket", getNMSClass("Packet")).invoke(playerConnection, packet);
} catch (Exception var4) {
var4.printStackTrace();
}
}
public static Class<?> getNMSClass(String name) {
String version = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3];
try {
return Class.forName("net.minecraft.server." + version + "." + name);
} catch (ClassNotFoundException var3) {
var3.printStackTrace();
return null;
}
}
public static void sendTitle(Player player, Integer fadeIn, Integer stay, Integer fadeOut, String title, String subtitle) {
try {
Object e;
Constructor subtitleConstructor;
if (title != null) {
title = ChatColor.translateAlternateColorCodes('&', title);
title = title.replaceAll("%player%", player.getDisplayName());
e = getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0].getField("TIMES").get((Object)null);
Object chatTitle = getNMSClass("IChatBaseComponent").getDeclaredClasses()[0].getMethod("a", String.class).invoke((Object)null, "{\"text\":\"" + title + "\"}");
subtitleConstructor = getNMSClass("PacketPlayOutTitle").getConstructor(getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0], getNMSClass("IChatBaseComponent"), Integer.TYPE, Integer.TYPE, Integer.TYPE);
Object titlePacket = subtitleConstructor.newInstance(e, chatTitle, fadeIn, stay, fadeOut);
sendPacket(player, titlePacket);
e = getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0].getField("TITLE").get((Object)null);
chatTitle = getNMSClass("IChatBaseComponent").getDeclaredClasses()[0].getMethod("a", String.class).invoke((Object)null, "{\"text\":\"" + title + "\"}");
subtitleConstructor = getNMSClass("PacketPlayOutTitle").getConstructor(getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0], getNMSClass("IChatBaseComponent"));
titlePacket = subtitleConstructor.newInstance(e, chatTitle);
sendPacket(player, titlePacket);
}
if (subtitle != null) {
subtitle = ChatColor.translateAlternateColorCodes('&', subtitle);
subtitle = subtitle.replaceAll("%player%", player.getDisplayName());
e = getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0].getField("TIMES").get((Object)null);
Object chatSubtitle = getNMSClass("IChatBaseComponent").getDeclaredClasses()[0].getMethod("a", String.class).invoke((Object)null, "{\"text\":\"" + title + "\"}");
subtitleConstructor = getNMSClass("PacketPlayOutTitle").getConstructor(getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0], getNMSClass("IChatBaseComponent"), Integer.TYPE, Integer.TYPE, Integer.TYPE);
Object subtitlePacket = subtitleConstructor.newInstance(e, chatSubtitle, fadeIn, stay, fadeOut);
sendPacket(player, subtitlePacket);
e = getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0].getField("SUBTITLE").get((Object)null);
chatSubtitle = getNMSClass("IChatBaseComponent").getDeclaredClasses()[0].getMethod("a", String.class).invoke((Object)null, "{\"text\":\"" + subtitle + "\"}");
subtitleConstructor = getNMSClass("PacketPlayOutTitle").getConstructor(getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0], getNMSClass("IChatBaseComponent"), Integer.TYPE, Integer.TYPE, Integer.TYPE);
subtitlePacket = subtitleConstructor.newInstance(e, chatSubtitle, fadeIn, stay, fadeOut);
sendPacket(player, subtitlePacket);
}
} catch (Exception var13) {
var13.printStackTrace();
}
}
public static void clearTitle(Player player) {
sendTitle(player, 0, 0, 0, "", "");
}
}
Kod:
TitleAPI.sendTitle(oyuncu, 30, 600, 30,"ANA BAŞLIK" ,"alt yazı" );
ilk 30: title ın ekrana giriş zamanı
600: title ın ekranda durma süresi
ikinci 30: title ın ekrandan koybolma zamanı
peki ekranda olan title ı nasıl silebilirim;
Kod:
TitleAPI.clearTitle(oyuncu);
actionbarapi;
actionbar ı api yi kurmadan önce on enable a eklememiz gereken bazı şeyler var;
bu on enable a değil üstüne eklenmesi gerekiyor;
bunu ekledikten sonra actionbar ımızı belirtelim;
bu kod on enable a ekiyoruz ve ekledikten sonra api mize geçelim;
peki nasıl kullanıcaz;
sendActionBar(oyuncu, "actionbar mesajımız");
peki zamanlı yapmak istersem;
sendActionBar(oyuncu, "actionbar mesajımız", 10*20);
*20 yapmamın sebebi ise int in aslında long olması yani eğer 100 saniye yapacaksanız 100*20 yazmanız gererekiyor.
actionbar ı api yi kurmadan önce on enable a eklememiz gereken bazı şeyler var;
bu on enable a değil üstüne eklenmesi gerekiyor;
Kod:
public static String nmsver;
private static boolean useOldMethods = false;
public static boolean works = true;
Kod:
nmsver = Bukkit.getServer().getClass().getPackage().getName();
nmsver = nmsver.substring(nmsver.lastIndexOf(".") + 1);
if (nmsver.equalsIgnoreCase("v1_8_R1") || nmsver.startsWith("v1_7_")) {
useOldMethods = true;
}
new ActionBarAPI(nmsver, useOldMethods, works);
Kod:
public class ActionBarAPI {
static String nmsver;
static boolean useOldMethods;
static boolean works;
public ActionBarAPI(String a, boolean b, boolean c){
nmsver = a;
useOldMethods = b;
works = c;
}
public static void sendActionBar(Player player, String message) {
if (!player.isOnline()) {
return; // Player may have logged out
}
if (nmsver.startsWith("v1_12_")) {
sendActionBarPost112(player, message);
} else {
sendActionBarPre112(player, message);
}
}
private static void sendActionBarPost112(Player player, String message) {
if (!player.isOnline()) {
return; // Player may have logged out
}
try {
Class<?> craftPlayerClass = Class.forName("org.bukkit.craftbukkit." + nmsver + ".entity.CraftPlayer");
Object craftPlayer = craftPlayerClass.cast(player);
Object ppoc;
Class<?> c4 = Class.forName("net.minecraft.server." + nmsver + ".PacketPlayOutChat");
Class<?> c5 = Class.forName("net.minecraft.server." + nmsver + ".Packet");
Class<?> c2 = Class.forName("net.minecraft.server." + nmsver + ".ChatComponentText");
Class<?> c3 = Class.forName("net.minecraft.server." + nmsver + ".IChatBaseComponent");
Class<?> chatMessageTypeClass = Class.forName("net.minecraft.server." + nmsver + ".ChatMessageType");
Object[] chatMessageTypes = chatMessageTypeClass.getEnumConstants();
Object chatMessageType = null;
for (Object obj : chatMessageTypes) {
if (obj.toString().equals("GAME_INFO")) {
chatMessageType = obj;
}
}
Object o = c2.getConstructor(new Class<?>[]{String.class}).newInstance(message);
ppoc = c4.getConstructor(new Class<?>[]{c3, chatMessageTypeClass}).newInstance(o, chatMessageType);
Method m1 = craftPlayerClass.getDeclaredMethod("getHandle");
Object h = m1.invoke(craftPlayer);
Field f1 = h.getClass().getDeclaredField("playerConnection");
Object pc = f1.get(h);
Method m5 = pc.getClass().getDeclaredMethod("sendPacket", c5);
m5.invoke(pc, ppoc);
} catch (Exception ex) {
ex.printStackTrace();
works = false;
}
}
private static void sendActionBarPre112(Player player, String message) {
if (!player.isOnline()) {
return; // Player may have logged out
}
try {
Class<?> craftPlayerClass = Class.forName("org.bukkit.craftbukkit." + nmsver + ".entity.CraftPlayer");
Object craftPlayer = craftPlayerClass.cast(player);
Object ppoc;
Class<?> c4 = Class.forName("net.minecraft.server." + nmsver + ".PacketPlayOutChat");
Class<?> c5 = Class.forName("net.minecraft.server." + nmsver + ".Packet");
if (useOldMethods) {
Class<?> c2 = Class.forName("net.minecraft.server." + nmsver + ".ChatSerializer");
Class<?> c3 = Class.forName("net.minecraft.server." + nmsver + ".IChatBaseComponent");
Method m3 = c2.getDeclaredMethod("a", String.class);
Object cbc = c3.cast(m3.invoke(c2, "{\"text\": \"" + message + "\"}"));
ppoc = c4.getConstructor(new Class<?>[]{c3, byte.class}).newInstance(cbc, (byte) 2);
} else {
Class<?> c2 = Class.forName("net.minecraft.server." + nmsver + ".ChatComponentText");
Class<?> c3 = Class.forName("net.minecraft.server." + nmsver + ".IChatBaseComponent");
Object o = c2.getConstructor(new Class<?>[]{String.class}).newInstance(message);
ppoc = c4.getConstructor(new Class<?>[]{c3, byte.class}).newInstance(o, (byte) 2);
}
Method m1 = craftPlayerClass.getDeclaredMethod("getHandle");
Object h = m1.invoke(craftPlayer);
Field f1 = h.getClass().getDeclaredField("playerConnection");
Object pc = f1.get(h);
Method m5 = pc.getClass().getDeclaredMethod("sendPacket", c5);
m5.invoke(pc, ppoc);
} catch (Exception ex) {
ex.printStackTrace();
works = false;
}
}
public static void sendActionBar(final Player player, final String message, int duration) {
sendActionBar(player, message);
if (duration >= 0) {
// Sends empty message at the end of the duration. Allows messages shorter than 3 seconds, ensures precision.
new BukkitRunnable() {
@Override
public void run() {
sendActionBar(player, "");
}
}.runTaskLater(ANACLASS.getPlugin(), duration + 1);
}
// Re-sends the messages every 3 seconds so it doesn't go away from the player's screen.
while (duration > 40) {
duration -= 40;
new BukkitRunnable() {
@Override
public void run() {
sendActionBar(player, message);
}
}.runTaskLater(ANACLASS.getPlugin(), (long) duration);
}
}
public static void sendActionBarToAllPlayers(String message) {
sendActionBarToAllPlayers(message, -1);
}
public static void sendActionBarToAllPlayers(String message, int duration) {
for (Player p : Bukkit.getOnlinePlayers()) {
sendActionBar(p, message, duration);
}
}
}
sendActionBar(oyuncu, "actionbar mesajımız");
peki zamanlı yapmak istersem;
sendActionBar(oyuncu, "actionbar mesajımız", 10*20);
*20 yapmamın sebebi ise int in aslında long olması yani eğer 100 saniye yapacaksanız 100*20 yazmanız gererekiyor.
yine önemli bir api olan envanter i string e string i envantere çeviren apimiz bunu oyuncuların bilgilerini kaydetmede işimize yarıycak bildiğiniz gibi bir minigames odasına girerken oyuncunun envanterini kaydederiz ve oyun bitince geri veririz işte bu apide bunu sağlıyor;
peki nasıl kullanıcaz;
bu şekilde kullanılıyor, ayrıca,
bu şekildede oyuncunun envanterini set yapmış olursunuz
Kod:
public class Base64CoderAPI {
@NotNull
public static String toBase64(Inventory inventory) {
try {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream);
dataOutput.writeInt(inventory.getSize());
dataOutput.writeUTF(inventory.getTitle());
for (int i = 0; i < inventory.getSize(); i++) {
dataOutput.writeObject(inventory.getItem(i));
}
dataOutput.close();
return Base64Coder.encodeLines(outputStream.toByteArray());
} catch (Exception e) {
throw new IllegalStateException("Unable to save item stacks.", e);
}
}
public static Inventory fromBase64(String data) throws IOException {
try {
ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(data));
BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream);
Inventory inventory = Bukkit.getServer().createInventory(null, dataInput.readInt(), dataInput.readUTF());
for (int i = 0; i < inventory.getSize(); i++) {
inventory.setItem(i, (ItemStack) dataInput.readObject());
}
dataInput.close();
return inventory;
} catch (ClassNotFoundException e) {
throw new IOException("Unable to decode class type.", e);
}
}
Kod:
String envanterstring = Base64CoderAPI.toBase64(oyuncu.getInventory());
Inventory envaterinkendi = Base64CoderAPI.fromBase64(string);
Kod:
Inventory inv = null;
try {
inv = Base64CoderAPI.fromBase64(envanterstringiozel);
} catch (IOException e) {
e.printStackTrace();
}
p.getInventory().setContents(inv.getContents());
Benden bu kadar diğer konumda görüşmek dileğiyle
(resimler, yazılar ve kodlar bana aittir alıntı yapabilirsiniz)
(konu biraz uzun ama okuyunca düşünsene sende minigames yazabiliceksin)
Etiketler: @KilllerDragons , @S4RP , @Za_ion101 , @Elfen , @Atomy , @Onurbey034 , @Spygrand , @ByAehn , @GodofMilker , @Frodox , @ShortPallMall , @MCTDark
Son düzenleme: