Fethi Polat 1
Fethi Polat
Scarlet 1
Scarlet
noisiv 1
noisiv
Manwe Work 1
Manwe Work
bencemal 1
bencemal
mavzermete 1
mavzermete
farkmt2official 1
farkmt2official
Bvural41 1
Bvural41
Hikaye Ekle

Altın Konu Python | Mob Drop İtem Anotasyon Scripti

  • Konuyu başlatan Konuyu başlatan Esinti
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 21
  • Görüntüleme Görüntüleme 3K

Ayyıldız2 | 2008 TR Yapısı • 1-99 Orta Emek Destan • Oto Avsız • 10 Temmuz 21:00 HEMEN TIKLA!

Merhaba,
Oyun dosyalarında mobların düşürdüğü itemları daha kolay düzenleyebilmek için küçük bir Python scripti yazdım.

Bu sistem, mob_drop_item.txt dosyasındaki item VNUM'larına karşılık gelen isimleri item_names.txt dosyasından çekerek, her satırın yanına hangi itemın düştüğünü yorum olarak ekliyor.

Böylece dosyayı açtığınızda neyin ne olduğunu anlamak için sürekli başka bir yere bakmanıza gerek kalmıyor.
Hem düzenleme hem de kontrol açısından bayağı zaman kazandırıyor.


Sistem Nasıl Çalışıyor?

  1. load_item_names Fonksiyonu:
    • item_names.txt dosyasını okuyup VNUM ve item isimlerini bir sözlükte (dictionary) topluyor.
    • Dosyada boş satırları ve başlık satırlarını (VNUM ile başlayanlar) atlıyor.
    • Satırları tab ya da boşlukla ayırıp VNUM ile ismi eşleştiriyor.
  2. annotate_mob_drop_items Fonksiyonu:
    • mob_drop_item.txt dosyasını satır satır okuyor.
    • Her satırda bir VNUM bulduğunda, bunu item_names sözlüğünde arıyor.
    • Eğer VNUM eşleşirse, satırın sonuna -- item_adı şeklinde bir yorum ekliyor.
    • Eşleşme yoksa satırı olduğu gibi bırakıyor.
    • Sonuçları yeni bir dosyaya (new_mob_drop_item.txt) yazıyor.
  3. Kodun Genel Akışı:
    • Gerekli dosyaları scriptle birlikte aynı klasörün içine koyuyorsunuz.
    • Scripti çalıştırdığınızda, anotasyonlu yeni bir dosya oluşuyor.

Kullanım​

  • item_names.txt ve mob_drop_item.txt dosyalarınızı verdiğim python dosyası ile aynı dizine koyun.
  • Scripti çalıştırın, ardından new_mob_drop_item.txt adında yeni bir dosya oluşacak.
  • Örneğin, mob_drop_item.txt içinde 12345 50001 gibi bir satır varsa ve item_names.txt içinde 50001 Altın Kılıç yazıyorsa, çıktı dosyasında şu şekilde görünecek.
1742261946941.png

Yardım için teşekkürler şef! @Tunga 🫡
 

Ekli dosyalar

Son düzenleme:

En Çok Reaksiyon Alan Mesajlar

Paylaşım için teşekkürler, kodunda ufak tefek iyilleştirmeler yaptım. Regex ile precompiled bir pattern ile aramak çok daha performanslı olacaktır, ayrıca error handling kısmında hata alanlar için ekstra detaylar var.
Python:
import re
import os

try:
    from pathlib import Path
except ImportError:
    os.system("pip install pathlib")
    from pathlib import Path

def load_item_names(item_names_filename: str) -> dict[str, str]:
    item_names = {}
    try:
        with open(item_names_filename, "r", encoding="windows-1254", errors="replace") as f:
            for line in f:
                line = line.strip()
                if not line or line.startswith("VNUM"):
                    continue
                parts = line.split("\t", 1) if "\t" in line else line.split(None, 1)
                if len(parts) < 2:
                    continue
                item_names[parts[0]] = parts[1].strip()
    except UnicodeDecodeError as e:
        print(f"Encoding error in {item_names_filename}: {e}")
        print("Using replacement characters for invalid bytes")
    except FileNotFoundError:
        print(f"Error: {item_names_filename} not found")
    except Exception as e:
        print(f"Error reading {item_names_filename}: {e}")
    return item_names

def annotate_mob_drop_items(mob_drop_filename: str, item_names: dict, output_filename: str) -> None:
    pattern = re.compile(r"^\d+\s+(\d+)")
    try:
        with open(mob_drop_filename, "r", encoding="windows-1254", errors="replace") as fin, \
             open(output_filename, "w", encoding="windows-1254") as fout:
            for line in fin:
                if match := pattern.match(line.strip()):
                    vnum = match.group(1)
                    if vnum in item_names:
                        fout.write(f"{line.rstrip()} -- {item_names[vnum]}\n")
                        continue
                fout.write(line)
    except UnicodeDecodeError as e:
        print(f"Encoding error in {mob_drop_filename}: {e}")
        print("Using replacement characters for invalid bytes")
    except FileNotFoundError:
        print(f"Error: {mob_drop_filename} not found")
    except Exception as e:
        print(f"Error processing files: {e}")

def main() -> None:
    current_dir = Path.cwd()
    item_names_file = current_dir / "item_names.txt"
    mob_drop_file = current_dir / "mob_drop_item.txt"
    output_file = current_dir / "new_mob_drop_item.txt"
   
    if not item_names_file.exists() or not mob_drop_file.exists():
        print("Item names or mob drop file not found")
        return
       
    item_names = load_item_names(item_names_file)
    if item_names:
        annotate_mob_drop_items(mob_drop_file, item_names, output_file)
        print(f"Completed: {output_file}")
if __name__ == "__main__":
    main()
Merhaba,
Oyun dosyalarında mobların düşürdüğü itemları daha kolay düzenleyebilmek için küçük bir Python scripti yazdım.

Bu sistem, mob_drop_item.txt dosyasındaki item VNUM'larına karşılık gelen isimleri item_names.txt dosyasından çekerek, her satırın yanına hangi itemın düştüğünü yorum olarak ekliyor.

Böylece dosyayı açtığınızda neyin ne olduğunu anlamak için sürekli başka bir yere bakmanıza gerek kalmıyor.
Hem düzenleme hem de kontrol açısından bayağı zaman kazandırıyor.


Sistem Nasıl Çalışıyor?

  1. load_item_names Fonksiyonu:
    • item_names.txt dosyasını okuyup VNUM ve item isimlerini bir sözlükte (dictionary) topluyor.
    • Dosyada boş satırları ve başlık satırlarını (VNUM ile başlayanlar) atlıyor.
    • Satırları tab ya da boşlukla ayırıp VNUM ile ismi eşleştiriyor.
  2. annotate_mob_drop_items Fonksiyonu:
    • mob_drop_item.txt dosyasını satır satır okuyor.
    • Her satırda bir VNUM bulduğunda, bunu item_names sözlüğünde arıyor.
    • Eğer VNUM eşleşirse, satırın sonuna // item_adı şeklinde bir yorum ekliyor.
    • Eşleşme yoksa satırı olduğu gibi bırakıyor.
    • Sonuçları yeni bir dosyaya (mob_drop_item_annotated.txt) yazıyor.
  3. Kodun Genel Akışı:
    • Dosya yollarını belirtiyorsunuz (örneğin, item_names.txt ve mob_drop_item.txt).
    • Scripti çalıştırdığınızda, anotasyonlu yeni bir dosya oluşuyor.

[CODE lang="python" title="Code"]import re

def load_item_names(item_names_filename):
item_names = {}
with open(item_names_filename, "r", encoding="windows-1254") as f:
for line in f:
line = line.strip()
if not line:
continue
if line.startswith("VNUM"):
continue
parts = line.split("\t")
if len(parts) < 2:
parts = line.split()
if len(parts) < 2:
continue
vnum = parts[0]
name = " ".join(parts[1:])
else:
vnum = parts[0]
name = parts[1].strip()
item_names[vnum] = name
return item_names

def annotate_mob_drop_items(mob_drop_filename, item_names, output_filename):
with open(mob_drop_filename, "r", encoding="windows-1254") as fin, open(output_filename, "w", encoding="windows-1254") as fout:
for line in fin:
stripped_line = line.strip()
if re.match(r"^\d+", stripped_line):
tokens = stripped_line.split()
if len(tokens) >= 2:
vnum = tokens[1]
if vnum in item_names:
comment = " // " + item_names[vnum]
fout.write(line.rstrip() + comment + "\n")
continue
fout.write(line)

if __name__ == "__main__":
item_names_file = r"c:\Users\esinti\Desktop\item_names.txt"
mob_drop_file = r"c:\Users\esinti\Desktop\TungaSF\mob_drop_item.txt"
output_file = r"c:\Users\esinti\Desktop\TungaSF\mob_drop_item_annotated.txt"

item_names = load_item_names(item_names_file)
annotate_mob_drop_items(mob_drop_file, item_names, output_file)

print("Tamamlandi", output_file)[/CODE]

Kullanım​

  • item_names.txt ve mob_drop_item.txt dosyalarınızın yolunu kodda kendi yollarınıza göre değiştirin.
  • Scripti çalıştırın, ardından mob_drop_item_annotated.txt adında yeni bir dosya oluşacak.
  • Örneğin, mob_drop_item.txt içinde 12345 50001 gibi bir satır varsa ve item_names.txt içinde 50001 Altın Kılıç yazıyorsa, çıktı dosyasında şu şekilde görünecek.
  • Ekli dosyayı görüntüle 136141
Yardım için teşekkürler şef! @Tunga 🫡
işte bu ne zamandır bekliyordum
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst