이전 글에서 서버에 모드를 설치하는 방법을 안내드렸습니다!
혹시 못보신 분들이나 이 글의 내용 중 이해가 안되는 부분이 있다면, 아래 링크를 먼저 참고하시길 바랍니다.
발헤임 서버에 모드 설치는 어떻게 해요!? 모드 설치 설명서!
먼저, 서버 설정을 하려면 서버가 있어야 겠지유? 서버를 맹그는 법은 앞선 저의 글을 확인하시기 바랍니다. GCP를 이용 데드케이트 서버, 변질되어버린 Night of the Dead 서버 생성 기록기 1화 일단,
up4n.tistory.com
해당 글에서 설명을 빼먹은 것이 있는데...
서버 상에서는 Dedicated_Valheim_Server_Script 툴이 기본적으로 모드 세팅을 위해 해당 툴도 설치해주기 때문에 관계 없지만, 로컬상에서는 이를 별도로 찾아다 설치하셔야 합니다.
BepInEx 라는 모드는 모든 모드에 기본을 담당하는 라이브러리 모드입니다.
때문에 보통 모드는 BepInEx 내에서 동작합니다.
BepInExPack Valheim v5.4.1901
BepInEx pack for Valheim. Preconfigured and includes unstripped Unity DLLs.
valheim.thunderstore.io
설치는 위 링크에서 확인하실 수 있습니다.
또한 아래 내용은 모두 서버내에서 vi 툴로 작성이 가능하지만... 부디 로컬에서 만드신 뒤, devcommands로 spawn하여 실제 생각한대로 NPC가 동작하는지 테스트까지 해보시고 파일 업로드를 통해 NPC 설정값을 올리시는 것을 추천드립니다.
그럼 이 글에서 소개하는 RRRNpcs 모드가 대체 뭐냐?
바로 삭막한 발헤임 세상을 여러분 뿐 아니라 다양한 NPC로 채워줄 수 있습니다.
이를 이용해 도적 / 산적과 같은 약탈자를 만들 수도, 특별한 능력을 지닌 NPC도 만들 수 있습니다.
저는 이를 이용해 1 ~ 6 단계의 NPC 무리들과 일종의 전설적인 단계의 고유 NPC를 꾸려 발헤임 세상을 즐겼고, 조금 독특한 세상을 꾸몄죠.
그럼 먼저, NPC를 만드는 코어 모드부터 설명드리겠습니다.
RRRNpcs v0.2.4
Adds non-player humans to the game, with custom humans via JSON config.
valheim.thunderstore.io
위 링크에서 모드를 다운받아 설치하시면 되며, 그 설치 방법은 아래를 보시면 알 수 있습니다.
참고로 이 모드는 RRRCore가 필요한 모드입니다. RRR 계열 모드의 라이브러리로 아래 링크를 통해 동일한 방법으로 설치하시면 됩니다.
RRRCore v2.14.0
Core library used by my other mods.
valheim.thunderstore.io
아무튼 다시 돌아와서 NPC 모드는 단지 NPC를 만드는 것으로 이 NPC가 소환되려면 또 다른 모드가 필요하기합니다.
이를 해결하기 위해 어떤 모드를 쓰면 좋은지도 안내를 하고 있습니다. 모드에서는 RRR 계열 모드를 통해 소환하도록 안내가 되고 있지만, 저는 Spawn That 을 통해 만든 NPC를 소환하였으며, 그 내용은 다른 글에서 안내드리겠습니다.
그럼 모드를 잘 설치했다고 생각하고, 본적적으로 NPC를 만드는 방법을 설명드리겠습니다.
그럼 모드를 설치한 채로 한번 발헤임을 실행하시면, '게임설치위치/BeplnEx/config' 폴더에 모드의 기본적인 설정파일 (.cfg) 이 생기는데...
(모드 설치시 이미 있을 수도 있습니다.)
생긴 Sample 을 기준으로 1차로 설명 드리고, 제가 만든 NPC를 가지고 추가로 설명 드리겠습니다.
자 그럼, 설정파일이 생겼다고 치고! '게임설치위치/BeplnEx/config/rrrnpcs.custom.Example.json' 파일을 메모장 같은 문서편집 프로그램을 이용하여, 열어보시면...
{
"sOriginalPrefabName" : "RRR_NPC",
"sNewPrefabName" : "Example",
"Category_Appearance" : {
"vScale" : {
"fX" : 1,
"fY" : 1,
"fZ" : 1
},
"cTintColor" : null,
"cTintItems" : null,
"cBodySmoke" : null,
"cBodyFlames" : null,
"sCustomTexture" : null
},
"Category_Character" : {
"sName" : "Human",
"sFaction" : "Players",
"bBoss" : false,
"sBossEvent" : "",
"sDefeatSetGlobalKey" : "",
"fMoveSpeedMulti" : 1,
"bToleratesWater" : true,
"bToleratesFire" : false,
"bToleratesSmoke" : false,
"bStaggerWhenBlocked" : null,
"fHealth" : 100,
"dDamageTaken" : {
"m_blunt" : "Normal",
"m_slash" : "Normal",
"m_pierce" : "Normal",
"m_chop" : "Immune",
"m_pickaxe" : "Immune",
"m_fire" : "Normal",
"m_frost" : "Normal",
"m_lightning" : "Normal",
"m_poison" : "Normal",
"m_spirit" : "Immune"
}
},
"Category_Humanoid" : {
"dtAttackDamageOverride" : {
"fDamage" : 0,
"fBlunt" : 0,
"fSlash" : 0,
"fPierce" : 0,
"fChop" : 0,
"fPickaxe" : 0,
"fFire" : 0,
"fFrost" : 0,
"fLightning" : 0,
"fPoison" : 0,
"fSpirit" : 0
},
"fAttackDamageTotalOverride" : null,
"sAttackProjectileOverride" : null,
"aDefaultItems" : [
],
"aRandomWeapon" : [
],
"aRandomArmor" : [
],
"aRandomShield" : [
],
"aaRandomSets" : [
],
"aHitEffects" : [
"vfx_player_hit",
"RRR_NPC_sfx_hit"
],
"aDeathEffects" : [
"vfx_player_death",
"RRR_NPC_ragdoll",
"RRR_NPC_sfx_death"
],
"aConsumeItemEffects" : [
"sfx_eat"
],
"aAdvancedCustomAttacks" : null
},
"Category_BaseAI" : {
"fViewRange" : 30,
"fViewAngle" : 90,
"fHearRange" : 9999,
"aAlertedEffects" : [
"RRR_NPC_sfx_alerted"
],
"aIdleEffects" : [
"RRR_NPC_sfx_idle"
],
"fIdleEffectsInterval" : 10,
"fIdleEffectsChance" : 0.5,
"sPathAgentType" : "Humanoid",
"fRandomCircleInterval" : 2,
"fRandomMoveInterval" : 30,
"fRandomMoveRange" : 3,
"bRandomFly" : false,
"fChanceToTakeoff" : 1,
"fChanceToLand" : 1,
"fGroundDuration" : 10,
"fAirDuration" : 10,
"fMaxLandAltitude" : 5,
"fFlyAltitudeMin" : 3,
"fFlyAltitudeMax" : 10,
"fTakeoffTime" : 5,
"bAvoidFire" : false,
"bAfraidOfFire" : false,
"bAvoidWater" : true,
"sSpawnMessage" : "",
"sDeathMessage" : ""
},
"Category_MonsterAI" : {
"fAlertRange" : 20,
"bFleeIfHurtWhenTargetCantBeReached" : true,
"bFleeIfNotAlerted" : false,
"fFleeIfLowHealth" : 0,
"bCirculateWhileCharging" : true,
"bCirculateWhileChargingFlying" : false,
"bEnableHuntPlayer" : false,
"bAttackPlayerObjects" : true,
"bAttackPlayerObjectsWhenAlerted" : null,
"fInterceptTimeMax" : 2,
"fInterceptTimeMin" : 0,
"fMaxChaseDistance" : 300,
"fMinAttackInterval" : 0,
"fCircleTargetInterval" : 8,
"fCircleTargetDuration" : 6,
"fCircleTargetDistance" : 8,
"bSleeping" : false,
"bNoiseWakeup" : false,
"fNoiseRangeScale" : null,
"fWakeupRange" : 5,
"aWakeupEffects" : [
],
"bAvoidLand" : false,
"aConsumeItems" : [
],
"fConsumeRange" : 2,
"fConsumeSearchRange" : 5,
"fConsumeSearchInterval" : 10,
"fConsumeHeal" : 0
},
"Category_CharacterDrop" : {
"bReplaceOriginalDrops" : true,
"drDrops" : [
]
},
"Category_Special" : {
"bCanTame" : false,
"bAlwaysTame" : false,
"bCommandableWhenTame" : false,
"bCanProcreateWhenTame" : false,
"bFxNoTame" : false,
"bSfxNoAlert" : false,
"bSfxNoIdle" : false,
"bSfxNoHit" : false,
"bSfxNoDeath" : false
},
"Category_NpcOnly" : {
"bIsFemale" : false,
"bRandomGender" : false,
"bNoBeardIfFemale" : false,
"aBeardIds" : [
"BeardNone",
"Beard1",
"Beard2",
"Beard3",
"Beard4",
"Beard5",
"Beard6",
"Beard7",
"Beard8",
"Beard9",
"Beard10"
],
"aHairIds" : [
"HairNone",
"Hair1",
"Hair2",
"Hair3",
"Hair4",
"Hair5",
"Hair6",
"Hair7",
"Hair8",
"Hair9",
"Hair10",
"Hair11",
"Hair12",
"Hair13",
"Hair14"
],
"cSkinColorMin" : {
"fRed" : 0.5,
"fGreen" : 0.5,
"fBlue" : 0.5
},
"cSkinColorMax" : {
"fRed" : 1,
"fGreen" : 1,
"fBlue" : 1
},
"cHairColorMin" : {
"fRed" : 1,
"fGreen" : 0.5,
"fBlue" : 0.3
},
"cHairColorMax" : {
"fRed" : 1,
"fGreen" : 0.9,
"fBlue" : 0.7
},
"fHairValueMin" : 0.1,
"fHairValueMax" : 1
},
"sConfigFormatVersion" : "0.2.0"
}
여기서 가장 중요한 값은 우선 아래 나열한 값으로...
"sOriginalPrefabName" : "RRR_NPC",
"sNewPrefabName" : "Example",
'sOriginalPrefabName ' 와 'sNewPrefabName' 가 조합되어 고유한 키값이 됩니다. 때문에 devcommand를 통해 테스트시 사용할 값이 해당 값입니다. 위 내용을 기준으로 예시 NPC를 소환한다고 가정한다면 아래와 같이 작성하면 되겠지요.
> devcommands
> spawn RRRN_Example
RRR_NPC 라는 'sOriginalPrefabName' 은 이 모드의 고유 키값이라고 생각하시면 되시고, 이 값을 실 사용할 때는 약어로 RRRN_ 로서 작용하는 것으로 생각됩니다. 이어서 'sNewPrefabName' 값이 이 NPC의 고유 키값으로 조합하면 위와 같이 되는 것이지요.
해당 값은 다른 Spawn / Raid 모드에서 사용되는 PrefabKey 이므로, 아무렇게나 작성해도 괜찮지만! 나중에 쓰이는 값이라는 걸 주의드리고 싶습니다.
"Category_Appearance" : {
"vScale" : {
"fX" : 1,
"fY" : 1,
"fZ" : 1
},
"cTintColor" : null,
"cTintItems" : null,
"cBodySmoke" : null,
"cBodyFlames" : null,
"sCustomTexture" : null
},
이어서, 'Category_Appearance'는 이 NPC의 전반적인 외형 설정입니다. 전반적이라 함은 모든 항목에 적용되는 설정으로 예를 들어, 'vScale' 의 X축을 수정할 경우, 들고 있는 무기까지 포함하여, vScale이 적용됩니다. 나머지 항목들도 동일하죠.
아무튼, 이 중 사용될 만한 설정은 'vScale'로 X, Y 축은 앞,뒤,좌,우 Z 축은 높이(키)를 의미합니다.
주의하실 점은 Z축의 경우, 1.0 이상이 될 경우, 지상에서 떠다니게됩니다. (물론 위아래로 길어진 상태로요.)
다만 1.0 이하일 경우에는 이상이 없기에, 드워프 같은 NPC를 만들 수 있습니다.
다음부터는 세부 정보 관련된 항목들이 설정되는데, 먼저 NPC 이름, 체력 등은 아래와 같이 설정합니다.
"Category_Character" : {
"sName" : "Human",
"sFaction" : "Players",
"bBoss" : false,
"sBossEvent" : "",
"sDefeatSetGlobalKey" : "",
"fMoveSpeedMulti" : 1,
"bToleratesWater" : true,
"bToleratesFire" : false,
"bToleratesSmoke" : false,
"bStaggerWhenBlocked" : null,
"fHealth" : 100,
"dDamageTaken" : {
"m_blunt" : "Normal",
"m_slash" : "Normal",
"m_pierce" : "Normal",
"m_chop" : "Immune",
"m_pickaxe" : "Immune",
"m_fire" : "Normal",
"m_frost" : "Normal",
"m_lightning" : "Normal",
"m_poison" : "Normal",
"m_spirit" : "Immune"
}
},
여기서 좀 중요한 점이 있는데, 'sFaction' 은 말그대로 팩션으로 이 항목을 설정한 것에 따라 최초 등장시 또는 동료가 되기전, 어떤 종족과 싸울지 또는 가만히 세워둘 때 뭘 막아줄 수 있는지 (수비병 역할 등...) 을 정할 수 있습니다.
이게 무슨 말이냐면, 같은 Players 팩션으로 수비병처럼 NPC들을 세워두고, 동일한 Players 팩션이지만 Raid / Spawn 으로 플레이어를 공격하는 NPC를 만들면... 수비병도 동일한 Players 팩션이라 신경도 안쓰는 상황도 연출이 가능하죠.
'bBoss'는 체력바가 있는 NPC를 만들 수 있고, 그 아래 'sBossEvent', 'sDefeatSetGlobalKey'는 이벤트의 트리거 등을 지정할 수 있는 내용으로 보다 풍부한 설정을 넣으실 때나 필요할 값입니다.
'fMoveSpeedMulti' 값은 이 NPC의 이동속도로 0.1 차이로도 매우 빠르기 때문에, 조금씩 조절해 가면서 지정하시는 것이 좋습니다. 이 값이 높으면, 하단부 인공지능 설정에 때라 말도안되는 NPC도 가능합니다.
1.3 정도만 가져도 말도 안되게 빠른데, 한대치고 빠지는 인공지능같은 형태로...
그 아래 임프가 불을 싫어하는 것과 같은 싫어하는 것을 설정할 수 있고, 'fHealth' 로 체력을 정할수 있습니다.
이 체력은 200 이어도 생각보다 크다는 생각이 들지 않습니다. 왜냐면... NPC들은 정예가 등장하지 않습니다. (별 달린 친구들) 때문에 200도 안되는 NPC는 늑대 1별 에게도 지는 충격적인 상황이 발생하죠.
바로 아래 'dDamageTaken'은 말그대로 면역을 정하는 항목으로 Weak, Normal, Immune 3가지를 입력할 수 있습니다.
모든 값을 Immune으로 둔다면 조련하고, 도축검으로 죽이는 것 외엔 죽일 방법이 없습니다!
"Category_Humanoid" : {
"dtAttackDamageOverride" : {
"fDamage" : 0,
"fBlunt" : 0,
"fSlash" : 0,
"fPierce" : 0,
"fChop" : 0,
"fPickaxe" : 0,
"fFire" : 0,
"fFrost" : 0,
"fLightning" : 0,
"fPoison" : 0,
"fSpirit" : 0
},
"fAttackDamageTotalOverride" : null,
"sAttackProjectileOverride" : null,
"aDefaultItems" : [
],
"aRandomWeapon" : [
],
"aRandomArmor" : [
],
"aRandomShield" : [
],
"aaRandomSets" : [
],
"aHitEffects" : [
"vfx_player_hit",
"RRR_NPC_sfx_hit"
],
"aDeathEffects" : [
"vfx_player_death",
"RRR_NPC_ragdoll",
"RRR_NPC_sfx_death"
],
"aConsumeItemEffects" : [
"sfx_eat"
],
"aAdvancedCustomAttacks" : null
},
다음, 'Category_Humanoid' 는 설명하면 아주 다양하게 사용할 수 있기때문에...
다른 글로서 여러분께 예시와 함께 안내해 드리겠습니다.
전반적으로 안내 드리면, NPC의 장비를 설정해주는 항목이고, 이 중 'aHitEffects', 'aDeathEffects', 'aConsumeItemEffects' 이 세항목은 그냥 건드리지 않는게 좋습니다.
건드려도 별 차이가 확인되지 않기 때문이죠.
"Category_BaseAI" : {
"fViewRange" : 30,
"fViewAngle" : 90,
"fHearRange" : 9999,
"aAlertedEffects" : [
"RRR_NPC_sfx_alerted"
],
"aIdleEffects" : [
"RRR_NPC_sfx_idle"
],
"fIdleEffectsInterval" : 10,
"fIdleEffectsChance" : 0.5,
"sPathAgentType" : "Humanoid",
"fRandomCircleInterval" : 2,
"fRandomMoveInterval" : 30,
"fRandomMoveRange" : 3,
"bRandomFly" : false,
"fChanceToTakeoff" : 1,
"fChanceToLand" : 1,
"fGroundDuration" : 10,
"fAirDuration" : 10,
"fMaxLandAltitude" : 5,
"fFlyAltitudeMin" : 3,
"fFlyAltitudeMax" : 10,
"fTakeoffTime" : 5,
"bAvoidFire" : false,
"bAfraidOfFire" : false,
"bAvoidWater" : true,
"sSpawnMessage" : "",
"sDeathMessage" : ""
},
"Category_MonsterAI" : {
"fAlertRange" : 20,
"bFleeIfHurtWhenTargetCantBeReached" : true,
"bFleeIfNotAlerted" : false,
"fFleeIfLowHealth" : 0,
"bCirculateWhileCharging" : true,
"bCirculateWhileChargingFlying" : false,
"bEnableHuntPlayer" : false,
"bAttackPlayerObjects" : true,
"bAttackPlayerObjectsWhenAlerted" : null,
"fInterceptTimeMax" : 2,
"fInterceptTimeMin" : 0,
"fMaxChaseDistance" : 300,
"fMinAttackInterval" : 0,
"fCircleTargetInterval" : 8,
"fCircleTargetDuration" : 6,
"fCircleTargetDistance" : 8,
"bSleeping" : false,
"bNoiseWakeup" : false,
"fNoiseRangeScale" : null,
"fWakeupRange" : 5,
"aWakeupEffects" : [
],
"bAvoidLand" : false,
"aConsumeItems" : [
],
"fConsumeRange" : 2,
"fConsumeSearchRange" : 5,
"fConsumeSearchInterval" : 10,
"fConsumeHeal" : 0
},
두 항목은 AI관련 항목으로 BaseAI는 기본 AI 이며, MosterAI는 전투 AI 라고 이해하시면 편합니다. 해당 항목에서 무슨 아이템을 먹는지도 설정할 수 있습니다.
다만 해당 아이템을 먹어도 새끼를 낳지는 못합니다.
"Category_CharacterDrop" : {
"bReplaceOriginalDrops" : true,
"drDrops" : [
]
},
이 항목은 드랍아이템 설정인데, 위의 설정 그 어느 것을 하더라도 드랍은 이 항목에 적힌 것만 되며, 드랍 확률 같은 것을 정할 수 없으며, 무조건 1개만 정의할 수 있습니다만...!
RRRNPCs 자체가 너무 인기가 없어, 정보가 적습니다...
혹시 드랍 태이블을 설정할 수 있는 방법을 아시는 분은 댓글 부탁드립니다.
일단, 제가 해보기로는 단 1개의 아이템을 확률도 없이 설정할 수 밖에 없다는 거!
"Category_Special" : {
"bCanTame" : false,
"bAlwaysTame" : false,
"bCommandableWhenTame" : false,
"bCanProcreateWhenTame" : false,
"bFxNoTame" : false,
"bSfxNoAlert" : false,
"bSfxNoIdle" : false,
"bSfxNoHit" : false,
"bSfxNoDeath" : false
},
다음은 테이밍 관련 항목이 있는 'Category_Special' 로 해당 항목을 조절하여, 늑대와 같이 아이템을 먹여 테임할 수 있도록 수정할 수도 있습니다.
동전을 주어 테임하도록 한다면, 용병처럼 가능한 거죠. (근데 너무 오래 걸리니까 추천하지는 않습니다.)
"Category_NpcOnly" : {
"bIsFemale" : false,
"bRandomGender" : false,
"bNoBeardIfFemale" : false,
"aBeardIds" : [
"BeardNone",
"Beard1",
"Beard2",
"Beard3",
"Beard4",
"Beard5",
"Beard6",
"Beard7",
"Beard8",
"Beard9",
"Beard10"
],
"aHairIds" : [
"HairNone",
"Hair1",
"Hair2",
"Hair3",
"Hair4",
"Hair5",
"Hair6",
"Hair7",
"Hair8",
"Hair9",
"Hair10",
"Hair11",
"Hair12",
"Hair13",
"Hair14"
],
"cSkinColorMin" : {
"fRed" : 0.5,
"fGreen" : 0.5,
"fBlue" : 0.5
},
"cSkinColorMax" : {
"fRed" : 1,
"fGreen" : 1,
"fBlue" : 1
},
"cHairColorMin" : {
"fRed" : 1,
"fGreen" : 0.5,
"fBlue" : 0.3
},
"cHairColorMax" : {
"fRed" : 1,
"fGreen" : 0.9,
"fBlue" : 0.7
},
"fHairValueMin" : 0.1,
"fHairValueMax" : 1
},
마지막으로 NPC의 외형 설정입니다. 이 곳에서 성별, 머리스타일, 수염 등을 설정할 수 있으며...
모든 것을 랜덤화할 수도 있습니다. 여러개를 넣으면 그것들 중 1개가 정해집니다.
여기서 주의하실 내용으로는 'bRandomGender' 를 true로 두고 랜덤한 성별로 설정할 경우, 수염이 없어야하지만... 수염을 지닌채 만들어집니다. 때문에 남자 NPC와 여자 NPC는 되도록이면, 별개로 나누는 것을 추천드립니다.
수염을 지닌... 멋진 여성을 좋아하신다면 크흠.
말리지 않겠습니다.
아무튼 여러분의 발헤임을 외롭지 않게 할 수 있는 NPC를 추가할 수 있는 모드를 소개드렸는데요. 글이 너무 길어져... 샘플 밖에 다루지 못했네요.
다음 글에서 여러분께 제가 만들었던 NPC와 함께 추가적인 정보를 드리겠습니다.
'게임 아지트 > Valheim' 카테고리의 다른 글
발헤임에서 나만의 NPC를 만들어보자, RRRNpcs 모드! 2화 (0) | 2023.03.31 |
---|---|
발헤임 서버에 모드 설치는 어떻게 해요!? 모드 설치 설명서! (0) | 2023.03.12 |