Eklenti Paylaşımı [1.16.5 - 1.20.1] AreaPlayerControl ⭐ Belirli alanda kaç oyuncunun olduğunu öğrenin.

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

Yuqas

Birisi mi Spawnlandı?
Katılım
4 Nisan 2024
Mesajlar
5
Elmaslar
2
Puan
1.985
Konum
Balıkesir
Minecraft
1Yuqas

Discord:

1yuqes

Minecraft Sürümleri
1.16.5 1.17.1 1.18.4 1.19.2 1.20.1
AreaPlayerControl
Sunucuda belirlediğiniz alanları aktif olarak kaç tane oyuncu olduğunuzu görmenizi sağlar.

COMMANDS:
/area save <name>
alan oluşturmanıza veya zaten oluşturulmuş bir alanı değiştirme sağlar WorldEdit ile çalışır.
/area remove <name> mevcut olan alanınızın silmenize işe yarar.
/area info <name> kaydettiğiniz alanınızın bilgisini gösterir. (pos1,pos2,placeholder)
/area list kaydettiğiniz alanları listeler.

NASIL ALAN OLUŞTURULUR:
ilk öncelikler WorldEdit ile alanı seçiyoruz /area save <name> komudu ile alanımızı oluşturuyoruz eyer alanın Placeholderını öğrenmek için ise /area info <name> komudunu kullanmak yeterli olacaktır.

PLACEHOLDER:
%yuqas_area_<areaname>%

ADDONS:
Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.

Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.


↓↓ İndir ↓↓

Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.

Değerli ziyaretçimiz, içeriği görebilmek için şimdi giriş yapın veya kayıt olun.

 
Son düzenleme:
Ne amaçla kullanabiliriz ki
 
Ne amaçla kullanabiliriz ki
Sanırsam bir bölge kontrol etmek için, örnek world1 deki oyuncuların sayısını görüntülemek ve ayrımak için world 1 world 2 world 3 diye ama ne kadar gerekli tartışmaya açıktır.
 
Sanırsam bir bölge kontrol etmek için, örnek world1 deki oyuncuların sayısını görüntülemek ve ayrımak için world 1 world 2 world 3 diye ama ne kadar gerekli tartışmaya açıktır.
Benim aklıma şöyle bir mantık geldi, aynı worlddeki birden farklı zone için online göstermek ki placeholder desteği de buna uygun bir özellik bu sayede mesela warp komutunda o warpta kaç kişi olduğunu belirtebilirsin hoş bir detay fakat böyle bir şey için sistem yormaya değer mi bilmiyorum sonuçta mesela bir worlddeki oyuncu sayısı sadece basit bir variable olduğu için bunu göstermenin maliyeti düşük fakat bu tarz bir placeholderı her görüntüleyişinde placeholder mantığıyla placeholder her tetiklendiğinde matematiksel bir işlem yapman gerekiyor optimizasyon için dakikada bir hesaplatabilirsin fakat bu tarz delaylı placeholderlar beni pek sarmıyor açıkcası rahatsız edici olabiliyor
 
Sanırsam bir bölge kontrol etmek için, örnek world1 deki oyuncuların sayısını görüntülemek ve ayrımak için world 1 world 2 world 3 diye ama ne kadar gerekli tartışmaya açıktır.
Belirli Seçilmiş bir alanda ne kadar oyuncu sayısını görmeyi sağlayan bir eklentidir genelde boxpvp tarzı sunucular bunları kullanır dünya açmak biraz laglı olabilir bunun yerine dünyadaki belirli alanda sayım alması daha mantıklı bide bu eklentinin işlevinde paralı bir eklenti gördüm ondan yaptım
 
BoxPvP oyun modum için eklentiyi test edip bir optimizasyon sorununa yol açmayacaksa değerlendirmek isterim. Başarılı bir eklentiye benziyor inceledikten sonra tekrardan bir yorum bırakacağım.
 
BoxPvP oyun modum için eklentiyi test edip bir optimizasyon sorununa yol açmayacaksa değerlendirmek isterim. Başarılı bir eklentiye benziyor inceledikten sonra tekrardan bir yorum bırakacağım.
olabilecek en kötü şekilde yazılmış :D her placeholder requestte area scan atıyo
Eğer eklentinin amacı boxpvplerdeki warplarda bulunan online sayısıysa, warp komutu ile ışınlanma gerçekleştiğinde belirli bir değişkeni arttırıp oyuncu bölgeden ayrıldığında (ışınlanma ya da quit event) belirli bir değişkeni azaltıp bunu döndürmek en optimize yol.
Tabi bu yöntem warpa giriş ve çıkışlar sadece ışınlanmayla mümkünse geçerli

Placeholder her tetiklendiğinde tetiklenen kod;
Kod:
   public String onPlaceholderRequest(Player player, @NotNull String params) {
      if (!params.startsWith("area_")) {
         return null;
      } else {
         String areaName = params.substring("area_".length()).toLowerCase();
         if (!this.areasConfig.contains(areaName)) {
            return "Area not found";
         } else {
            String worldName = this.areasConfig.getString(areaName + ".world");
            Location pos1 = this.parseLocation(this.areasConfig.getString(areaName + ".pos1"), worldName);
            Location pos2 = this.parseLocation(this.areasConfig.getString(areaName + ".pos2"), worldName);
            if (pos1 != null && pos2 != null) {
               int playerCount = this.countPlayersInArea(pos1, pos2);
               return String.valueOf(playerCount);
            } else {
               return "Invalid area";
            }
         }
      }
   }

   private Location parseLocation(String posString, String worldName) {
      if (posString != null && worldName != null) {
         posString = posString.replace("{", "").replace("}", "");
         String[] parts = posString.split(", ");
         double x = Double.parseDouble(parts[0].split(":")[1]);
         double y = Double.parseDouble(parts[1].split(":")[1]);
         double z = Double.parseDouble(parts[2].split(":")[1]);
         return new Location(Bukkit.getWorld(worldName), x, y, z);
      } else {
         return null;
      }
   }

   private int countPlayersInArea(Location pos1, Location pos2) {
      int count = 0;
      List<Player> players = Bukkit.getWorld(pos1.getWorld().getName()).getPlayers();
      Iterator var5 = players.iterator();

      while(var5.hasNext()) {
         Player player = (Player)var5.next();
         Location loc = player.getLocation();
         if (this.isInArea(loc, pos1, pos2)) {
            ++count;
         }
      }

      return count;
   }

   private boolean isInArea(Location loc, Location pos1, Location pos2) {
      double minX = Math.min(pos1.getX(), pos2.getX());
      double maxX = Math.max(pos1.getX(), pos2.getX());
      double minY = Math.min(pos1.getY(), pos2.getY());
      double maxY = Math.max(pos1.getY(), pos2.getY());
      double minZ = Math.min(pos1.getZ(), pos2.getZ());
      double maxZ = Math.max(pos1.getZ(), pos2.getZ());
      return loc.getX() >= minX && loc.getX() <= maxX && loc.getY() >= minY && loc.getY() <= maxY && loc.getZ() >= minZ && loc.getZ() <= maxZ;
   }
 
Son düzenleme:
4 class dan oluşan bir eklenti :D
 
olabilecek en kötü şekilde yazılmış :D her placeholder requestte area scan atıyo
Eğer eklentinin amacı boxpvplerdeki warplarda bulunan online sayısıysa, warp komutu ile ışınlanma gerçekleştiğinde belirli bir değişkeni arttırıp oyuncu bölgeden ayrıldığında (ışınlanma ya da quit event) belirli bir değişkeni azaltıp bunu döndürmek en optimize yol.
Tabi bu yöntem warpa giriş ve çıkışlar sadece ışınlanmayla mümkünse geçerli
Ne demek istediğini anladım fakat bunu düzeltirsem yeni jar yükleyince ban sebebimi
 
Ne demek istediğini anladım fakat bunu düzeltirsem yeni jar yükleyince ban sebebimi
Eklenti yazasım vardı eklenti fikrini daha mantıklı bir eklenti fikrine çevirdim kafamda adı lokasyon
Oyuncuların yerel konumlarını kaydeden bir eklenti.

Çalışma mantığı bir oyuncu ışınlandığında tetikleniyor ve ışınlanılan blok (evet blok kaydediyor) bir lokasyon konumuysa oyuncunun yeni konumunu orası olarak ayarlıyor.

Her lokasyon bloğu kendi değerine de sahip yani o bloğa bir oyuncu ışınlanınca artıyor ve oyuncu başka bir lokasyon bloğuna ışınlanırsa azalıyor.

Claim eklentilerini şu şekilde destekliyor, eğer oyuncu mesela bir towna girdiyse yerel konumunu orası olarak gösteriyor fakat bir ışınlanma işlemi gerçekleşmediği için lokasyon bloğundaki değeri azaltmıyor yani warp ormanda bir towna girdiğinde yerel lokasyonu geçici olarak değişiyor fakat farklı bir lokasyon bloğuna ışınlanmadığı için lokasyon bloğundaki değer oynamıyor.

Bu arada bu yerel kayıtlar büyük ölçüde gereksiz muhtemelen bir kullanım alanı gelmedi aklıma ondan yazmam sanırım :D. Lokasyon blokları ise türkçesi kulağa hoş gelen güzel bir konsept, sunucu sahipleri de rahat kavrar

Lokasyon değişimlerini sadece bir başka lokasyon bloğuna ışınlandığında tetiklemek (sunucudan ayrılmak bir istisna) en esnek yöntem muhtemelen bu sayede oyuncudan oyuncuya ışınlanmak gibi şeylerde bir sorun olmaz. Sunucu sahipleri için bir yük tabi bütün warplara bir lokasyon bloğu eklemek gerekir ama eklentinin amacı da bu zaten ayarlasınlar bi zahmet :D

Lokasyon değişimleri eğer ışınlanılan yer farklı bir lokasyon bloğu değilse bunun için yeni bir mantık uydurmak gerekiyor.
Mesela oyuncu başka bir oyuncuya ışınlanıyorsa ışınlanan oyuncunun lokasyonu ışınlandığı oyuncunun lokasyonu olarak ayarlanmalı.
Diğer durumları şimdi düşünemicem fakat en optimize yol için bütün durumlar hesaba katılmalı.
Aslında bunu düşündükçe batıyorum :D boxpvp harici bir sunucuda yemez galiba lokasyon bloğu sistemi

Eklentiyi daha ikonik hale getirmek için lokasyon bloğunu oyundaki bir blokla otomatik olarak değiştirme özelliği de eklenebilir belki oyuncular dejavu yaşar sunucudan sunucuya D: Hatta kozmetikte eklenebilir lokasyon bloğu tetiklendiğinde parlar satışları arttırabilir.
 
Son düzenleme:
olabilecek en kötü şekilde yazılmış :D her placeholder requestte area scan atıyo
Eğer eklentinin amacı boxpvplerdeki warplarda bulunan online sayısıysa, warp komutu ile ışınlanma gerçekleştiğinde belirli bir değişkeni arttırıp oyuncu bölgeden ayrıldığında (ışınlanma ya da quit event) belirli bir değişkeni azaltıp bunu döndürmek en optimize yol.
Tabi bu yöntem warpa giriş ve çıkışlar sadece ışınlanmayla mümkünse geçerli

Placeholder her tetiklendiğinde tetiklenen kod;
Kod:
   public String onPlaceholderRequest(Player player, @NotNull String params) {
      if (!params.startsWith("area_")) {
         return null;
      } else {
         String areaName = params.substring("area_".length()).toLowerCase();
         if (!this.areasConfig.contains(areaName)) {
            return "Area not found";
         } else {
            String worldName = this.areasConfig.getString(areaName + ".world");
            Location pos1 = this.parseLocation(this.areasConfig.getString(areaName + ".pos1"), worldName);
            Location pos2 = this.parseLocation(this.areasConfig.getString(areaName + ".pos2"), worldName);
            if (pos1 != null && pos2 != null) {
               int playerCount = this.countPlayersInArea(pos1, pos2);
               return String.valueOf(playerCount);
            } else {
               return "Invalid area";
            }
         }
      }
   }

   private Location parseLocation(String posString, String worldName) {
      if (posString != null && worldName != null) {
         posString = posString.replace("{", "").replace("}", "");
         String[] parts = posString.split(", ");
         double x = Double.parseDouble(parts[0].split(":")[1]);
         double y = Double.parseDouble(parts[1].split(":")[1]);
         double z = Double.parseDouble(parts[2].split(":")[1]);
         return new Location(Bukkit.getWorld(worldName), x, y, z);
      } else {
         return null;
      }
   }

   private int countPlayersInArea(Location pos1, Location pos2) {
      int count = 0;
      List<Player> players = Bukkit.getWorld(pos1.getWorld().getName()).getPlayers();
      Iterator var5 = players.iterator();

      while(var5.hasNext()) {
         Player player = (Player)var5.next();
         Location loc = player.getLocation();
         if (this.isInArea(loc, pos1, pos2)) {
            ++count;
         }
      }

      return count;
   }

   private boolean isInArea(Location loc, Location pos1, Location pos2) {
      double minX = Math.min(pos1.getX(), pos2.getX());
      double maxX = Math.max(pos1.getX(), pos2.getX());
      double minY = Math.min(pos1.getY(), pos2.getY());
      double maxY = Math.max(pos1.getY(), pos2.getY());
      double minZ = Math.min(pos1.getZ(), pos2.getZ());
      double maxZ = Math.max(pos1.getZ(), pos2.getZ());
      return loc.getX() >= minX && loc.getX() <= maxX && loc.getY() >= minY && loc.getY() <= maxY && loc.getZ() >= minZ && loc.getZ() <= maxZ;
   }
Evet bende fark ettim ve kullanmaktan vazgeçtim :/
 
bence cok iyi cok profosyonel
 
yani özgürsün zaten arkadaşım dedi diye yaptım paylaşmak aklıma geldi
Evet özgürüm. Kötü bir yorum yapmadım sadece eklentinin çalışma sistemi hoşuma gitmedi ve kullanmamaya karar verdim. İlk yorumumda da belirttiğim gibi inceledikten sonra yorum bıraktım bu kadar.
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

Hala Discord sunucumuza katılmadın mı?

Büyük bir topluluğun parçası ol, etkinliklere katıl ve özel hediyeler kazanma şansı yakala!

Şimdi Katıl
Üst