Bulundu Daireden son çıkan kazanır

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Skripti optimize yazıp yazmamak sana kalmış, yurt dışında tüm sistemleri skript ile yazan insanlarda var 5 TPS oyun keyfi yazmak biraz yanlış diye düşünüyorum
 
Niye çok fazla kaynak tüketsin komut blokları ile istediği kıvama getirmek çok uğraştırıcı olur, eklentiden daha mantıklı bir yol yok.
Eklenti ile bir sürü blok verisi, takım verisi ve daha fazla veriyi bulunduracağı için gene lag yapar. ama Minecraft'da bir blok var bütün alanın verini kaydedip, onu istediğin gibi ayarlamanı sağlayıp komut bloğuyla yapılıyor. Bu en sağlıklı yöntemdir.
 
Eklenti ile bir sürü blok verisi, takım verisi ve daha fazla veriyi bulunduracağı için gene lag yapar. ama Minecraft'da bir blok var bütün alanın verini kaydedip, onu istediğin gibi ayarlamanı sağlayıp komut bloğuyla yapılıyor. Bu en sağlıklı yöntemdir.
Çok saçma o zaman neredeyse tüm minigameler sağlıksız mı örneğin skywars. cachede tutuğu veriler zaten maksimum 10 15 dakika sürüyor takım, blok gibi onun dışında arenalar çok performanslı olsun dersen ki aşırı kritik değil async db+caffeine ile çözülüyor.
 
Çok saçma o zaman neredeyse tüm minigameler sağlıksız mı örneğin skywars. cachede tutuğu veriler zaten maksimum 10 15 dakika sürüyor takım, blok gibi onun dışında arenalar çok performanslı olsun dersen ki aşırı kritik değil async db+caffeine ile çözülüyor.
Elbette yapılır ve optimizesi düzgün olursa elbet olur, ama en mantıklı seçenek Komut bloğudur bence ve ekstra Ortada çıkan chestdeki itemlerin random doğması, vb. birçok şey bütün itemleri tek tek else diye koda eklemen gerek bu durumdada eklenti seçeneği kötüdür.
 
Elbette yapılır ve optimizesi düzgün olursa elbet olur, ama en mantıklı seçenek Komut bloğudur bence ve ekstra Ortada çıkan chestdeki itemlerin random doğması, vb. birçok şey bütün itemleri tek tek else diye koda eklemen gerek bu durumdada eklenti seçeneği kötüdür.
Bu tarz bir şeyi else if ile yapacaksan hiç yapmaman daha iyi olur
 
Biraz özgün kalın herkes yapmaya başladı ben şahsen ilk çıktığı sunucudan başka sunucuda oynamam
 
Peki nasıl yapmayı düşünüyorsun fikrin nedir yapmak istesen?
Yaptığım için böyle konuşuyorum, lootları cacheleyip shulker/chest içine random yerleştirmek en mantıklısı.
Kod:
Bukkit.getScheduler().runTaskLater(ZenDaire.getInstance(), () -> {
            List<Loot> loots = ZenDaire.getInstance().getCacheManager().getLootItems().get(phase);

            for (int dx = -1; dx <= 1; dx++) {
                for (int dz = -1; dz <= 1; dz++) {
                    Block block = world.getBlockAt(centerX + dx, centerY, centerZ + dz);
                    BlockState state = block.getState();

                    if (state instanceof ShulkerBox shulkerBox) {
                        Inventory inventory = shulkerBox.getSnapshotInventory();
                        Random random = new Random();
                        List<Integer> emptySlots = IntStream.range(0, inventory.getSize())
                                .boxed()
                                .collect(Collectors.toList());
                        Collections.shuffle(emptySlots);

                        int slotIndex = 0;

                        for (Loot loot : loots) {
                            double chance = loot.getChance();
                            double roll = random.nextDouble() * 100;
                            if (roll <= chance) {
                                ItemStack item = loot.getItem();
                                if (item != null && item.getType() != Material.AIR && slotIndex < emptySlots.size()) {
                                    int randomSlot = emptySlots.get(slotIndex++);
                                    inventory.setItem(randomSlot, item.clone());
                                }
                            }
                        }

                        shulkerBox.update(true, true);
                    }
                }
            }
        }, 1L);
 
Yaptığım için böyle konuşuyorum, lootları cacheleyip shulker/chest içine random yerleştirmek en mantıklısı.
Kod:
Bukkit.getScheduler().runTaskLater(ZenDaire.getInstance(), () -> {
            List<Loot> loots = ZenDaire.getInstance().getCacheManager().getLootItems().get(phase);

            for (int dx = -1; dx <= 1; dx++) {
                for (int dz = -1; dz <= 1; dz++) {
                    Block block = world.getBlockAt(centerX + dx, centerY, centerZ + dz);
                    BlockState state = block.getState();

                    if (state instanceof ShulkerBox shulkerBox) {
                        Inventory inventory = shulkerBox.getSnapshotInventory();
                        Random random = new Random();
                        List<Integer> emptySlots = IntStream.range(0, inventory.getSize())
                                .boxed()
                                .collect(Collectors.toList());
                        Collections.shuffle(emptySlots);

                        int slotIndex = 0;

                        for (Loot loot : loots) {
                            double chance = loot.getChance();
                            double roll = random.nextDouble() * 100;
                            if (roll <= chance) {
                                ItemStack item = loot.getItem();
                                if (item != null && item.getType() != Material.AIR && slotIndex < emptySlots.size()) {
                                    int randomSlot = emptySlots.get(slotIndex++);
                                    inventory.setItem(randomSlot, item.clone());
                                }
                            }
                        }

                        shulkerBox.update(true, true);
                    }
                }
            }
        }, 1L);
Eline sağlık
 
Bu aralar daireden son çıkan kazanır çok popüler oldu bazıları Korg pluginleri ile yapılabilir diyor ama ben çözemedim skriptle fonda olurmu bu yardımcı olabilir misiniz

Gerekli eklentiler (Skript 2.6 için)​


Zorunlu


  • Skript 2.6+
  • Vault + bir ekonomi eklentisi (örn. EssentialsX)

Önerilen (isteğe bağlı)


  • SkBee (action bar/bossbar, ufak kalite dokunuşları)
  • skRayFall (parçacıkla çember çizmek istersen)

Not: Aşağıdaki skript, opsiyoneller olmadan da çalışır. Parçacık çemberi istersen en sona küçük bir not bıraktım.

options:
prefix: &8[&cÇEMBER&8]&7
# Oyun ayarları (değiştirilebilir)
default-radius: 30
min-radius: 5
shrink-amount: 2
shrink-interval-seconds: 30
check-period-ticks: 10
prize-default: 0 # /ltl open sırasında belirtmezsen
tp-safe-offset: 1 # merkezin 1 blok üstüne ışınla
spawn-world: "world" # elenen nereye ışınlansın

variables:
{ltl.state} = "idle" # idle / open / active
{ltl.center} = none
{ltl.radius} = {@default-radius}
{ltl.minradius} = {@min-radius}
{ltl.shrink.amount} = {@shrink-amount}
{ltl.shrink.interval} = {@shrink-interval-seconds}
{ltl.prize} = {@prize-default}
{ltl.players::*} # katılımcı listesi

function ltl_reset():
set {ltl.state} to "idle"
set {ltl.center} to none
set {ltl.radius} to {@default-radius}
set {ltl.minradius} to {@min-radius}
set {ltl.shrink.amount} to {@shrink-amount}
set {ltl.shrink.interval} to {@shrink-interval-seconds}
set {ltl.prize} to {@prize-default}
delete {ltl.players::*}

command /ltl center:
permission: ltl.admin
trigger:
set {ltl.center} to location of player
send "{@prefix} Merkez belirlendi: %{ltl.center}%" to player

command /ltl open [<number>] [<number>] [<number>] [<number>]:
# /ltl open [radius] [minradius] [shrinkAmount] [prize]
permission: ltl.admin
trigger:
if {ltl.center} is none:
set {ltl.center} to location of player
set {ltl.state} to "open"
if arg-1 is set:
set {ltl.radius} to arg-1
if arg-2 is set:
set {ltl.minradius} to arg-2
if arg-3 is set:
set {ltl.shrink.amount} to arg-3
if arg-4 is set:
set {ltl.prize} to arg-4
delete {ltl.players::*}
broadcast "{@prefix} Çember etkinliği AÇILDI! Radius: &a%{ltl.radius}%&7 | Ödül: &a$%{ltl.prize}%&7"
broadcast "{@prefix} Katılmak için: &a/ltl join&7 | Başlatmak için: &a/ltl start"

command /ltl join:
trigger:
if {ltl.state} is not "open":
send "{@prefix} Şu an kayıt alınmıyor." to player
stop
if player is in {ltl.players::*}:
send "{@prefix} Zaten kayıttasın." to player
stop
add player to {ltl.players::*}
set {_loc} to {ltl.center}
add {@tp-safe-offset} to y-coordinate of {_loc}
teleport player to {_loc}
send "{@prefix} Oyuna katıldın. Çemberin dışına çıkan elenir!" to player
broadcast "{@prefix} &a%player% &7etkinliğe katıldı. Oyuncu sayısı: &a%size of {ltl.players::*}%"

command /ltl leave:
trigger:
if player is in {ltl.players::*}:
remove player from {ltl.players::*}
send "{@prefix} Kayıttan çıktın." to player
else:
send "{@prefix} Kayıtlı değilsin." to player

command /ltl start:
permission: ltl.admin
trigger:
if {ltl.state} is not "open":
send "{@prefix} Önce /ltl open ile etkinliği aç." to player
stop
if size of {ltl.players::*} < 1:
send "{@prefix} En az 1 oyuncu gerekli." to player
stop
set {ltl.state} to "active"
broadcast "{@prefix} Başladı! Radius: &a%{ltl.radius}%&7 | Son kalan kazanır!"
loop {ltl.players::*}:
send action bar "&cÇemberin dışına çıkma! &7(Radius: %{ltl.radius}%)" to loop-value

command /ltl stop:
permission: ltl.admin
trigger:
broadcast "{@prefix} Etkinlik durduruldu."
execute console command "spawn @a" # EssentialsX varsa herkesi spawna çeker
ltl_reset()

command /ltl forcejoin:
permission: ltl.admin
trigger:
if {ltl.state} is not "open":
send "{@prefix} Önce /ltl open." to player
stop
loop all players:
if loop-player is not in {ltl.players::*}:
add loop-player to {ltl.players::*}
set {_loc} to {ltl.center}
add {@tp-safe-offset} to y-coordinate of {_loc}
teleport loop-player to {_loc}
broadcast "{@prefix} Tüm çevrim içi oyuncular eklendi. Toplam: &a%size of {ltl.players::*}%"

# --- Oyun döngüsü: oyuncu kontrolü ve elenme
every {@check-period-ticks} ticks:
if {ltl.state} is "active":
loop {ltl.players::*}:
set {_p} to loop-value
if {_p} is offline:
remove {_p} from {ltl.players::*}
stop loop
# Mesafe kontrolü (Y dahil – pratikte sorun çıkarmaz)
set {_d} to distance between {_p} and {ltl.center}
if {_d} > {ltl.radius}:
broadcast "{@prefix} &c%{_p}% &7çemberin dışına çıktı ve elendi!"
remove {_p} from {ltl.players::*}
teleport {_p} to spawn of world "{@spawn-world}"
# Kazanan kontrolü
if size of {ltl.players::*} <= 1:
if size of {ltl.players::*} is 1:
set {_w} to first element of {ltl.players::*}
broadcast "{@prefix} &a%{_w}% &7kazandı! Ödül: &a$%{ltl.prize}%"
if {ltl.prize} > 0:
execute console command "eco give %{_w}% %{ltl.prize}%"
else:
broadcast "{@prefix} Kimse kalmadı, etkinlik sona erdi."
ltl_reset()

# --- Çember küçülmesi
every 1 second:
if {ltl.state} is "active":
add 1 to {ltl.timer.shrink}
if {ltl.timer.shrink} >= {ltl.shrink.interval}:
set {ltl.timer.shrink} to 0
if {ltl.radius} > {ltl.minradius}:
remove {ltl.shrink.amount} from {ltl.radius}
if {ltl.radius} < {ltl.minradius}:
set {ltl.radius} to {ltl.minradius}
broadcast "{@prefix} Çember küçüldü! Yeni radius: &a%{ltl.radius}%"
loop {ltl.players::*}:
send action bar "&eRadius küçüldü: %{ltl.radius}% blok" to loop-value

# Güvenlik: oyuncu çıkarsa listeden düş
on quit:
if player is in {ltl.players::*}:
remove player from {ltl.players::*}

(İsteğe bağlı) Parçacıkla çember çizme​


skRayFall kullanıyorsan, “every {@check-period-ticks} ticks” altına şu tek satırı ekleyebilirsin (sürekli kenarı çizer):

# skRayFall yüklüyse:
# drawCircle effect'i sürüme göre değişebilir; sende şu varyasyon çalışıyorsa kullan:
draw circle at {ltl.center} with radius {ltl.radius} with 80 points with particle redstone for {ltl.players::*}

Dipnot: Ayak üstü hazırladım, sorun çıkarsa, çıkan sorunları iletirseniz, gün içinde kod desteği sağlarım.



Skript bir yorumlayıcı evet javadan satır satıra daha yavaş ama doğru yazılmış, olay odaklı bir skript yarattığı ek yük milisaniyelerin altında kalır, sunucuyu öldüren şeyler genelde every tick döngüler, dünyayı oyuncuları sürekli tarayan içi boş büyük döngüler, ana threadyde dosya httpp abartılı parçacık ses spamı, aynı anda onlarca kez çalışan gereksiz komut olay tetikleri.

Bu hataları java pluginde de yapsa 5 tps görürsün, yani mesele skript = lag değildir. Mesele kötü yazılmış olması = lag

Doğru yazılmış skript gayet stabil çalışır, kötü yazılmış eklenti ise aynı derecede sorun çıkarır. Herkes kafasında skript = tps düşüşü gibi bir algı yaratmış ama durum öyle değil. Javaya hakim olmayan insanlar için gayet kullanışlı bir eklenti.
 

Gerekli eklentiler (Skript 2.6 için)​


Zorunlu


  • Skript 2.6+
  • Vault + bir ekonomi eklentisi (örn. EssentialsX)

Önerilen (isteğe bağlı)


  • SkBee (action bar/bossbar, ufak kalite dokunuşları)
  • skRayFall (parçacıkla çember çizmek istersen)





(İsteğe bağlı) Parçacıkla çember çizme​


skRayFall kullanıyorsan, “every {@check-period-ticks} ticks” altına şu tek satırı ekleyebilirsin (sürekli kenarı çizer):



Dipnot: Ayak üstü hazırladım, sorun çıkarsa, çıkan sorunları iletirseniz, gün içinde kod desteği sağlarım.




Skript bir yorumlayıcı evet javadan satır satıra daha yavaş ama doğru yazılmış, olay odaklı bir skript yarattığı ek yük milisaniyelerin altında kalır, sunucuyu öldüren şeyler genelde every tick döngüler, dünyayı oyuncuları sürekli tarayan içi boş büyük döngüler, ana threadyde dosya httpp abartılı parçacık ses spamı, aynı anda onlarca kez çalışan gereksiz komut olay tetikleri.

Bu hataları java pluginde de yapsa 5 tps görürsün, yani mesele skript = lag değildir. Mesele kötü yazılmış olması = lag

Doğru yazılmış skript gayet stabil çalışır, kötü yazılmış eklenti ise aynı derecede sorun çıkarır. Herkes kafasında skript = tps düşüşü gibi bir algı yaratmış ama durum öyle değil. Javaya hakim olmayan insanlar için gayet kullanışlı bir eklenti.
1: Öncelikle merhaba Skript her ne kadar pratik ve kolay olsa da, Java eklentiler daima Skript’ten daha verimlidir çünkü direkt Bukkit/Paper API’si üzerinden çalışır. Skript ise yorumlayıcı olduğundan doğal olarak ek bir katman yükü getirir.

2: Yazılan kod önce Skript tarafından çözülür, sonra Bukkit’e aktarılır. Bu da ekstra latency ve CPU tüketimi demektir.

Skript'deki değişkenler:
{var} dediğin şey aslında Skript’in kendi dosya tabanlı veri sisteminde tutuluyor (variables.csv). Bu sistem dosya okuma/yazma üzerine kurulu özellikle büyük sunucularda I/O darboğazı yaratıyor. Async veya cache mekanizması yok, her şey tek dosyada şişiyor.

Java'da veri/cache vb.:
Java’da veri yönetimi tamamen senin kontrolünde. Memory cache (HashMap, ConcurrentHashMap vs.) kullanıp, sadece gerektiğinde database’e yazabilirsin bu da inanılmaz performans farkı yaratır. Ayrıca MySQL, MongoDB, Redis gibi profesyonel sistemlere bağlanıp cluster yapabilirsin.


Ve son olarak skript ile yaptığın daire sistemi muhtemelen bozuk blocklar cachelenmemiş cart cut ve Skript ile bir daire sistemi yaparsan, Ryzen 9 9950x, 16 GB RAM gibi bir vds 50 oyuncuda anında laglanacaktır veya RAM yetersizliğinden dolayı çökecektir. Ama java'da bu sistem ile 100-150 aktif bile rahat kaldırır.
 
1: Öncelikle merhaba Skript her ne kadar pratik ve kolay olsa da, Java eklentiler daima Skript’ten daha verimlidir çünkü direkt Bukkit/Paper API’si üzerinden çalışır. Skript ise yorumlayıcı olduğundan doğal olarak ek bir katman yükü getirir.

2: Yazılan kod önce Skript tarafından çözülür, sonra Bukkit’e aktarılır. Bu da ekstra latency ve CPU tüketimi demektir.

Skript'deki değişkenler:
{var} dediğin şey aslında Skript’in kendi dosya tabanlı veri sisteminde tutuluyor (variables.csv). Bu sistem dosya okuma/yazma üzerine kurulu özellikle büyük sunucularda I/O darboğazı yaratıyor. Async veya cache mekanizması yok, her şey tek dosyada şişiyor.

Java'da veri/cache vb.:
Java’da veri yönetimi tamamen senin kontrolünde. Memory cache (HashMap, ConcurrentHashMap vs.) kullanıp, sadece gerektiğinde database’e yazabilirsin bu da inanılmaz performans farkı yaratır. Ayrıca MySQL, MongoDB, Redis gibi profesyonel sistemlere bağlanıp cluster yapabilirsin.


Ve son olarak skript ile yaptığın daire sistemi muhtemelen bozuk blocklar cachelenmemiş cart cut ve Skript ile bir daire sistemi yaparsan, Ryzen 9 9950x, 16 GB RAM gibi bir vds 50 oyuncuda anında laglanacaktır veya RAM yetersizliğinden dolayı çökecektir. Ama java'da bu sistem ile 100-150 aktif bile rahat kaldırır.
1756828216683.webp


Burada tam olarak ne dediğimi okuduğuna emin misin? Çünkü aynı şeyleri söylüyoruz zaten.

Gel gelelim ki ayak üstü hazırladığımı hata olursa kod desteği vereceğimi belirttim. Onu da geçtim, yazdıklarında arkadaşın sorununu çözmeye yönelik şeylerden ziyade laf yetiştirme var, adam skript ihtiyacı olduğunu belirtmiş, kullanıp kullanmamak onun kendi tercihi, ben ihtiyacına yönelik yardımcı olmaya çalışıyorum.
 
Ekli dosyayı görüntüle 271704

Burada tam olarak ne dediğimi okuduğuna emin misin? Çünkü aynı şeyleri söylüyoruz zaten.

Gel gelelim ki ayak üstü hazırladığımı hata olursa kod desteği vereceğimi belirttim. Onu da geçtim, yazdıklarında arkadaşın sorununu çözmeye yönelik şeylerden ziyade laf yetiştirme var, adam skript ihtiyacı olduğunu belirtmiş, kullanıp kullanmamak onun kendi tercihi, ben ihtiyacına yönelik yardımcı olmaya çalışıyorum.
"Bu aralar daireden son çıkan kazanır çok popüler oldu bazıları Korg pluginleri ile yapılabilir diyor ama ben çözemedim skriptle fonda olurmu bu yardımcı olabilir misiniz" Özellikle skript istediğini belirtmemiş başka şeylerde olabilir.

Ve skriptde birsürü function desteği yok nasıl iyi bir skript yazılabiliyor anlamadım. Skript'de pom.xml vb. şeyler yok yani skripti nasıl iyi yazıyorsun onu çözemedim ben
 
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