C# 프로그래밍 - solaris0115/RimWorldModGuide GitHub Wiki

C# 프로그래밍

이 챕터에서는 본격적인 C#프로그래밍에 대해 다룹니다. 기능을 만들고 새로운 아이템에 대한 클래스를 만들 것입니다.

새 프로젝트를 만들면서 Class1.cs가 이미 존재 하겠지만 상단에서 프로젝트>새 항목추가에서 클래스를 찾아 추가하실 수 있습니다.

1. 새로운 탄환에 대한 정의 클래스 만들기

새로운 탄환을 정의내리려면 C#으로 작성된 개체의 원형이 필요합니다.
따라서 새로운 탄환에 대한 정의 클래스를 만들어 추가적인 정보들을 집어 넣어줍니다.
이제 새 클래스를 아래와 같이 만들어 줍니다.

using RimWorld;
using Verse;

namespace Plague
{
    public class ThingDef_PlagueBullet : ThingDef
    {
        public float AddHediffChance = 0.05f;
        public HediffDef HediffToAdd = HediffDefOf.Plague;
    }
}

2. 새로운 탄환 기능을 위한 클래스 만들기

이 클래스는 총알 클래스를 상속받아 총알이 적중시 발동할 기능에 대해서 작성할 것입니다.
새 클래스를 하나 추가한 뒤 아래와 같이 작성해 줍니다.

using RimWorld;
using Verse;

namespace Plague
{
    public class Projectile_PlagueBullet : Bullet
    {
        #region Properties
        public ThingDef_PlagueBullet Def
        {
            get
            {
                return def as ThingDef_PlagueBullet;
            }
        }
        #endregion Properties
        #region Overrides
        protected override void Impact(Thing hitThing)
        {
            base.Impact(hitThing);
            
            if (Def != null && hitThing != null && hitThing is Pawn hitPawn)
            {
                var rand = Rand.Value;
                if (rand <= Def.AddHediffChance)
                {                   
                    Messages.Message("TST_PlagueBullet_SuccessMessage".Translate(new object[] {
                        this.launcher.Label, hitPawn.Label
                    }), MessageTypeDefOf.NeutralEvent);

                    var plagueOnPawn = hitPawn?.health?.hediffSet?.GetFirstHediffOfDef(Def.HediffToAdd);
                    var randomSeverity = Rand.Range(0.15f, 0.30f);
                    if (plagueOnPawn != null)
                    {
                        plagueOnPawn.Severity += randomSeverity;
                    }
                    else
                    {
                        Hediff hediff = HediffMaker.MakeHediff(Def.HediffToAdd, hitPawn, null);
                        hediff.Severity = randomSeverity;
                        hitPawn.health.AddHediff(hediff, null, null);
                    }
                }
                else 
                {
                    MoteMaker.ThrowText(hitThing.PositionHeld.ToVector3(), hitThing.MapHeld, "TST_PlagueBullet_FailureMote".Translate(Def.AddHediffChance), 12f);
                }
            }
        }
        #endregion Overrides
    }
}

Rimwolrd 혹은 Verse는 만들어야할 새 개체들에 대한 원형과 다양한 기능을 제공해줍니다.
이는 ILSpy와 같은 디컴파일러를 통해 어떤 정보들이 있는지 찾아봐야 합니다.
네, 매우 귀찮은 작업입니다. 저도 귀찮습니다.

이제 만들어 둔 코드를 Ctrl+Shift+B를 눌러 빌드 해줍니다.
만약 오류가 있다면 철자나 쉼표, 오탈자등을 찾아봅니다.
다행히도 비주얼 스튜디오는 똑똑해서 오류 메세지와 그 위치를 보여줍니다.

만약 버전이 변경되었거나 가이드 작성자의 멍청함으로 에러가 났다면 이메일 문의나 포럼에 문의를 주세요.

다음: 모드 테스트