مرجع API
مرجع كامل لواجهة C# API الخاصة بـ tModLoader مع أمثلة وأفضل الممارسات
وصول سريع
الفئات الأساسية
ModItem
الفئة الأساسية لإنشاء عناصر مخصصة. ارث من ModItem لإنشاء أسلحة وأدوات وإكسسوارات ومواد استهلاكية.
الدوال الرئيسية:
SetDefaults()
تعيين خصائص العنصر مثل الضرر والحجم والندرة وأسلوب الاستخدام
AddRecipes()
تحديد وصفات صناعة العنصر
UseItem(Player player)
سلوك مخصص عند استخدام العنصر
مثال على التنفيذ:
public class MagicSword : ModItem
{
public override void SetDefaults()
{
Item.damage = 80;
Item.DamageType = DamageClass.Magic;
Item.mana = 10;
Item.width = 44;
Item.height = 44;
Item.useTime = 25;
Item.useAnimation = 25;
Item.useStyle = ItemUseStyleID.Shoot;
Item.knockBack = 5;
Item.value = Item.buyPrice(gold: 5);
Item.rare = ItemRarityID.Pink;
Item.UseSound = SoundID.Item20;
Item.autoReuse = true;
Item.shoot = ProjectileID.MagicMissile;
Item.shootSpeed = 16f;
}
}
ModNPC
إنشاء شخصيات NPC مخصصة بما في ذلك الأعداء وشخصيات المدينة والزعماء بذكاء اصطناعي وسلوك مخصص.
الدوال الأساسية:
SetDefaults()
تعيين إحصائيات وخصائص NPC
AI()
منطق سلوك الذكاء الاصطناعي المخصص
ModifyNPCLoot()
تحديد جداول الإسقاط والغنائم
OnKill()
إجراءات عند قتل NPC
public class ExampleEnemy : ModNPC
{
public override void SetDefaults()
{
NPC.width = 40;
NPC.height = 56;
NPC.damage = 15;
NPC.defense = 6;
NPC.lifeMax = 100;
NPC.HitSound = SoundID.NPCHit1;
NPC.DeathSound = SoundID.NPCDeath2;
NPC.value = 60f;
NPC.knockBackResist = 0.5f;
NPC.aiStyle = NPCAIStyleID.Fighter;
AIType = NPCID.Zombie;
}
}
أنماط التطوير الشائعة
إنشاء الوصفات
public override void AddRecipes()
{
Recipe recipe = CreateRecipe();
recipe.AddIngredient(ItemID.IronBar, 5);
recipe.AddIngredient(ItemID.Wood, 10);
recipe.AddIngredient(ModContent.ItemType<CustomItem>(), 1);
recipe.AddTile(TileID.WorkBenches);
recipe.AddCondition(Recipe.Condition.InGraveyard);
recipe.Register();
}
تتم مزامنة الوصفات تلقائياً في اللعب الجماعي وتظهر في متصفحات الوصفات.
المقذوفات المخصصة
public class MagicBolt : ModProjectile
{
public override void SetDefaults()
{
Projectile.width = 16;
Projectile.height = 16;
Projectile.friendly = true;
Projectile.penetrate = 3;
Projectile.timeLeft = 600;
Projectile.light = 0.5f;
Projectile.DamageType = DamageClass.Magic;
}
public override void AI()
{
// Custom movement and visual effects
Projectile.rotation += 0.4f;
if (Main.rand.NextBool(3))
{
Dust.NewDust(Projectile.position, Projectile.width,
Projectile.height, DustID.Electric);
}
}
}
التعديلات العامة
تعديل محتوى اللعبة الموجود باستخدام فئات Global:
public class GlobalItemChanges : GlobalItem
{
public override void SetStaticDefaults()
{
// Modify all items of a specific type
}
public override void ModifyTooltips(Item item, List<TooltipLine> tooltips)
{
if (item.type == ItemID.TerraBlade)
{
tooltips.Add(new TooltipLine(Mod, "CustomTooltip",
"Enhanced by YourMod!"));
}
}
}
أفضل الممارسات
افعل
- استخدم ModContent.ItemType<T>() للإشارة إلى العناصر المخصصة
- نفّذ التحقق من القيم الفارغة بشكل صحيح
- استخدم أسماء متغيرات وفئات ذات معنى
- اختبر في بيئة لعب جماعي
- اتبع اصطلاحات تسمية C#
- وثّق الكود بتعليقات
لا تفعل
- لا تكتب معرفات العناصر بشكل ثابت - استخدم الثوابت
- لا تصل إلى Main.player مباشرة في اللعب الجماعي
- لا تنسَ التعامل مع الحالات الحدية
- لا تستخدم عمليات ثقيلة في دوال AI()
- لا تعدّل محتوى اللعبة الأصلي بدون داعٍ
- لا تتجاهل تحذيرات المترجم
أدوات ومساعدات مفيدة
دوال المساعدة الشائعة
// Get item type from mod item class
int itemType = ModContent.ItemType<MyCustomItem>();
// Check if mod is loaded
bool calamityLoaded = ModLoader.HasMod("CalamityMod");
// Create dust effects
Dust.NewDust(position, width, height, DustID.Electric);
// Spawn projectiles
Projectile.NewProjectile(source, position, velocity, type, damage, knockback);
// Play sounds
SoundEngine.PlaySound(SoundID.Item1, position);
مساعدات الشبكات
// Send data to server
ModPacket packet = Mod.GetPacket();
packet.Write((byte)MessageType.ExampleMessage);
packet.Write(someData);
packet.Send();
// Handle received packets
public override void HandlePacket(BinaryReader reader, int whoAmI)
{
MessageType msgType = (MessageType)reader.ReadByte();
switch (msgType)
{
case MessageType.ExampleMessage:
// Handle message
break;
}
}