Runa przywołania Klona 3567 4

O temacie

Autor Toworish

Zaczęty 1.11.2015 roku

Wyświetleń 3567

Odpowiedzi 4

Toworish

Toworish

Użytkownicy
http://chomikuj.pl/ToWoRiSh
posty1664
Propsy254
ProfesjaNierób
  • Użytkownicy
  • http://chomikuj.pl/ToWoRiSh

Toworish

Runa przywołania Klona
2015-11-01, 19:08(Ostatnia zmiana: 2016-01-10, 11:46)
Siema, pokaże wam Jak stworzyć runę przywołania klona, nie będę pisał krok po kroku że najpierw tworzymy gildie potem to i pstro, pokaże wam co gdzie macie wkleić, moje objaśnienia znaczenia skryptów nie koniecznie są prawidłowe, napisałem to tak jak ja to rozumiem, więc nie uczcie się tego:)

Po pierwsze potrzebny nam będzie ikarus i LeGo, ale do tego polecam poradnik EdkaSumo: http://themodders.org/index.php?topic=16580

A więc tak:
1. scripts\content\_intern\Constants.d
const int SPL_SummonKlon = 64; ///linijka 603

"SummonKlon", // 64   SPL_SummonKlon   ///linijka 750

"SUM", // 64   SPL_SummonKlon    /linijka 894
Wyszukaj:
const int GIL_EMPTY_D = 15;

Zmień na:

const int GIL_KLON = 15 ;

2.scripts\content\_moje    -tworzymy ten folder
2a.tworzymy plik: Usuwanie_Miecza.d i wklejamy w nim:
//Skrypt Napisany przez Splash'a z forum Themodders.org

func void RemoveWeapon ()
{
    var c_npc slf; slf = _^ (ECX);

    if (Hlp_GetInstanceID (slf) == Hlp_GetInstanceID (Klon))
    {
    CALL_IntParam (true);
    CALL_IntParam (false);
    CALL_zStringPtrParam ("ZS_RIGHTHAND");
    CALL__thiscall(_@ (slf), 7643760);
    };
};

2b.Tworzymy plik Zbroja.d i wklejamy w nim to:
var int Plaszcz;// zmienna zbroi
 var int MeleeWeapon;// zmienna broni do walki w zwarciu
 var int RangedWeapon;// zmienna broni do walki dystansowej
 var int UseMageKlon; // zmienna magiczna
func void ZBROJA()// funkcja
{
  var C_ITEM heroArmor; heroArmor = Npc_GetEquippedArmor(hero); //Zmienna mówiąca że heroArmor to to samo co Npc_GetEquippedArmor(hero)
  var C_ITEM HeroMeleeWeapon; HeroMeleeWeapon = Npc_GetEquippedMeleeWeapon(hero);//jak widać to samo co wyżej tylko z bronią w zwarciu
  var C_ITEM HeroRangedWeapon; HeroRangedWeapon = Npc_GetEquippedRangedWeapon(hero);// jak widać to samo co wyżej tylko z bronią dystansową

if Npc_HasEquippedMeleeWeapon (hero)// Jeśli hero ma na sobie Miecz
|| Npc_HasEquippedRangedWeapon (hero)// Jeśli hero ma na sobie łuk lub kusze
|| Npc_HasEquippedArmor (hero) //Jeśli hero ma na sobie jakąś zbroję
{
MeleeWeapon = (Hlp_GetInstanceID (HeroMeleeWeapon)); // to klon ma taką samą
RangedWeapon = (Hlp_GetInstanceID (HeroRangedWeapon)); // to klon ma taką samą
Plaszcz = (Hlp_GetInstanceID (heroArmor));//to klon ma taką samą
}
else // a jak nie
{
MeleeWeapon = NO_WEAPON;// to nie ma
RangedWeapon = NO_WEAPON;// to nie ma
Plaszcz = NO_ARMOR; // to nie ma
};

if (Hero.guild == GIL_KDF) // Jeśli hero jest magiem ognia
|| (Hero.guild == GIL_KDW) // albo jak jest magiem wody
{
UseMageKlon = MAGIC_KLON; // To use mage klon wpisane w skrypt klona zmienia się na MAGIC_KLON które dodawaliśmy w constants.d
}
else // a jak nie
{
UseMageKlon = 0; // to nie zmienia się
};
if(Npc_IsInState (klon, ZS_Dead)) //Jeśli klon nie zyje
{
Npc_RemoveInvItem (klon ,MeleeWeapon); // usuwamy mu Broń do walki w zwarciu żeby gracz nie mógł jej podpierdalać i sellać
Npc_RemoveInvItem (klon ,RangedWeapon); // tak jak wyżej
Npc_RemoveInvItems (klon, itrw_bolt, 1000); // usuwamy bełty
Npc_RemoveInvItems (klon, ItRw_Arrow, 1000); // i strzały
//Można też użyć opcji : Npc_clearInventory (klon);
};


};
3.content\AI:
AI_Intern\AI_Constants:
Pod tym:
const int AIV_SpellLevel = 88;

wklejamy to:
const int AIV_MagicKlon = 89;//Nowa stała aivara magii
const int MAGIC_NIET = 0;// nie używa
const int MAGIC_KLON = 1;//używa

zaś pod tym:
const int ID_SWAMPDRONE = 64;

Wklejamy to:
const int ID_Klon = 65;
Human\C_Human\C_DropUnconscious.d:
Pod:
|| (other.guild == GIL_BDT)

Wklejamy:

|| (other.guild == GIL_KLON)// ta

Pod:

&& (self.guild != GIL_BDT)

Wklejamy:

&& (self.guild != GIL_KLON)// i ta linijka są po to zeby nasz klon podczas walku imierał a nie tracił przytomność

AI\Human\guilds.d:
TO:
/* D   */ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /* D   */ ATT_NEUTRAL, ATT_NEUTRAL, /* D   */ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /* D   */ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, /* D   */ ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL, ATT_NEUTRAL
ZMIEŃ NA :
/* KLON*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /* KLON*/ ATT_FRIENDLY, ATT_FRIENDLY, /* KLON*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /* KLON*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, /* KLON*/ ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY, ATT_FRIENDLY
AI\Magic\Spells\SpellSumKlon.d
const int SPL_Cost_SummonKlon = 64;


INSTANCE Spell_SummonKlon (C_Spell_Proto) //ehem. Spell_Skeleton
{
time_per_mana = 0;
targetCollectAlgo = TARGET_COLLECT_NONE;
};

func int Spell_Logic_SummonKlon(var int manaInvested)
{
if (Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
{
return SPL_SENDCAST;
}
else if (self.attribute[ATR_MANA] >= SPL_Cost_SummonKlon)
{
return SPL_SENDCAST;
}
else //nicht genug Mana
{
return SPL_SENDSTOP;
};
};

func void Spell_Cast_SummonKlon()
{
if (Npc_GetActiveSpellIsScroll(self))
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
}
else
{
self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_SummonKlon;
};

self.aivar[AIV_SelectSpell] += 1;

if (Npc_IsPlayer(self))
{
Wld_SpawnNpcRange (self, Klon, 3, 500);
}
else
{
Wld_SpawnNpcRange (self, Skeleton, 1, 500);
};
};
AI\Magic:
B_SelectSpell.d
Pod tym:
// ------ Magier ------
if (slf.guild == GIL_KDF)
|| (slf.aivar[AIV_MagicUser] == MAGIC_ALWAYS)
{
if (Npc_HasItems (slf, ItRu_Concussionbolt) == 0)
{
CreateInvItems (slf, ItRu_Concussionbolt, 1);
};

if (Npc_HasItems (slf, ItRu_InstantFireBall) == 0)
{
CreateInvItems (slf, ItRu_InstantFireBall, 1);
};

if (Npc_HasItems (slf, ItRu_Deathball) == 0)
{
CreateInvItems (slf, ItRu_Deathball, 1);
};

if (Npc_HasItems (slf, ItRu_FullHeal) == 0)
{
CreateInvItems (slf, ItRu_FullHeal, 1);
};

if (self.attribute[ATR_HITPOINTS] < 100)
{
B_ReadySpell (slf, SPL_FullHeal, SPL_Cost_FullHeal);
return TRUE;
}
else if (C_NpcHasAttackReasonToKill (self))
{
if (self.flags == NPC_FLAG_IMMORTAL)
{
B_ReadySpell (slf, SPL_Deathball, SPL_Cost_Deathball);
}
else
{
B_ReadySpell (slf, SPL_InstantFireball, SPL_Cost_InstantFireBall);
};
return TRUE;
}
else
{
B_ReadySpell (slf, SPL_Concussionbolt, SPL_Cost_Concussionbolt);
return TRUE;
};
};
   
   
   
   
   
   WKLEJAMY TO:
   
   
    //-------- SystemWalkiCzaramiKlona --------------
if (slf.aivar[AIV_MagicKlon] == MAGIC_KLON) //Jeśli używa nowego aivara magii
{
if (Npc_HasItems (klon, ItRu_FireBolt) == 0) //Jeśli niema runy
{
CreateInvItems (klon, ItRu_FireBolt, 1); // Tworzy ją
};
if (Npc_HasItems (klon, ItRu_InstantFireball) == 0) //jak wyżej
{
CreateInvItems (klon, ItRu_InstantFireball, 1);
};
if (Npc_HasItems (klon, ItRu_Icelance) == 0)
{
CreateInvItems (klon, ItRu_Icelance, 1); //Jak wyżej
};
if (Npc_HasItems (klon, ItRu_Waterfist) == 0)
{
CreateInvItems (klon, ItRu_Waterfist, 1);// Jak wyżej
};
if (Hero.guild == GIL_KDF) //Jeśli hero jest magiem ognia
&& (Npc_GetTalentSkill (hero, NPC_TALENT_MAGE) <= 2) //Jeśli hero ma mniejszy bądź równy 2 krąg magii
{
B_ReadySpell (klon, SPL_FireBolt, SPL_Cost_FireBolt); //To klon używa czaru ognistej strzały
return TRUE; //Że potwierdzone info
}
else if (Hero.guild == GIL_KDW) // Jeśli hero jest Magiem wody
&& (Npc_GetTalentSkill (hero, NPC_TALENT_MAGE) <= 2) // i ma mniejszy będź równy 2 krąg
//|| (Kapitel <= 2)
{
B_ReadySpell (klon, SPL_Icelance, SPL_Cost_Icelance); //To klon używa czaru Lodowej lancy
return TRUE; //Że potwierdzone info
}
else if (Hero.guild == GIL_KDF) //Jeśli hero to Mag Ognia
&& (Npc_GetTalentSkill (hero, NPC_TALENT_MAGE) >= 3) // I jeśli ma większy bądź równy 3 kręgu magii
{
B_ReadySpell (klon, SPL_InstantFireball, SPL_Cost_InstantFireball); //To klon się nie pierdoli i używa kuli ognia
return TRUE;
}
else if (Hero.guild == GIL_KDW)// jak hero jest magiem wody
&& (Npc_GetTalentSkill (hero, NPC_TALENT_MAGE) >= 3)// i ma większy bądź równy 3 krąg magii
{
B_ReadySpell (klon, SPL_Waterfist, SPL_Cost_Waterfist); // to Klon nakurwia z Wodnej pięści
return TRUE;
};
};
C_CanNpcColidWithSpell.d:
pod:
|| (self.guild == GIL_Gargoyle)

Wklejamy:

|| (self.aivar[AIV_MM_REAL_ID] == ID_Klon)
Spell_ProcessMana.d
if (activeSpell == SPL_SummonKlon ) { return Spell_Logic_SummonKlon (manaInvested); }; //linijka 88AI\Monster:
B_Monster\B_SetMonsterAttitude.d:
pod:
Wld_SetGuildAttitude (fromGuild , attitude, GIL_KDW );
wklej:
Wld_SetGuildAttitude (fromGuild , attitude, GIL_KLON );



pod:
Wld_SetGuildAttitude (GIL_KDW , attitude, toGuild );
wklej:
Wld_SetGuildAttitude (GIL_KLON , attitude, toGuild );
C_Monster\C_NpcIsMonsterMage.d:
cały if w tym pliku powinien wyglądać tak:

if (slf.guild == GIL_SKELETON_MAGE)
|| (slf.guild == GIL_FIREGOLEM)
|| (slf.guild == GIL_ICEGOLEM)
|| (slf.guild == GIL_DRAGON)
|| (slf.guild == GIL_KLON) //Głównie chodzi o tą linijkę

chyba że już zaprowadziliście w nim zmiany wczesniej
RTN_Monster\ZS_MM_RTN_Klony.d:
func void B_JakZechceszRozmawiac()
{
Npc_ChangeAttribute (self, ATR_HITPOINTS, -self.attribute[ATR_HITPOINTS_MAX]);
};

func void ZS_MM_Rtn_Klony ()
{
Npc_SetPercTime (self, 1);
Npc_PercEnable (self, PERC_ASSESSPLAYER, B_MM_AssessPlayer);
Npc_PercEnable (self, PERC_ASSESSENEMY, B_MM_AssessEnemy);

Npc_PercEnable (self, PERC_ASSESSMAGIC,  B_AssessMagic);
Npc_PercEnable (self, PERC_ASSESSDAMAGE, B_MM_AssessDamage);
Npc_PercEnable (self,  PERC_ASSESSFIGHTSOUND, B_MM_AssessOthersDamage);

if (Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Wisp_Detector))
{
Npc_PercEnable (self, PERC_ASSESSTALK, B_AssessTalk);
}
else
{
Npc_PercEnable (self, PERC_ASSESSTALK, B_SummonedAssessTalk);
};

// FUNC

B_SetAttitude (self, ATT_FRIENDLY);
self.aivar[AIV_PARTYMEMBER] = TRUE;

AI_StandUp (self);
AI_SetWalkmode (self, NPC_RUN);
};

func int ZS_MM_Rtn_Klony_Loop()
{
// ------ beim Spieler bleiben ------
B_MM_WispDetect ();
if (Npc_GetDistToNpc (self, hero) > 100)
{
AI_GotoNpc (self, hero);
}
else //<= 500
{
if (Npc_GetStateTime(self) >= 1)
{
// ------ zum Spieler drehen ------
if (!Npc_CanSeeNpc(self, hero))
{
AI_TurnToNpc (self, hero);
};

// ------ Summon Time -------
self.aivar[AIV_SummonTime] = (self.aivar[AIV_SummonTime] + Npc_GetStateTime(self)); //weil AI_Goto länger dauern kann

if (Hero.Level > 500)
{
Npc_ChangeAttribute (self, ATR_HITPOINTS, -self.attribute[ATR_HITPOINTS_MAX]);
};

Npc_SetStateTime (self, 0);
};
};

self.wp = Npc_GetNearestWP (self);
return LOOP_CONTINUE;
};

func void ZS_MM_Rtn_Klony_End()
{

};
4.Content\Items\It_Runnen.d
///Wklejamy na samym dole

INSTANCE ItRu_Klon (C_Item)
{
name = NAME_Rune;

mainflag = ITEM_KAT_RUNE;
flags = 0;

value = Value_Ru_SumSkel;

visual = "ItRu_SumSkel.3DS";
material = MAT_STONE;

spell = SPL_SummonKlon;
//mag_circle = 3;
mag_circle = 0;

wear = WEAR_EFFECT;
effect = "SPELLFX_WEAKGLIMMER";

description = NAME_SPL_SummonKlon;

TEXT [0] = NAME_Mag_Circle;
COUNT [0] = mag_circle;

TEXT [1] = NAME_Manakosten;
COUNT [1] = SPL_COST_SUMMONSKELETON;

TEXT [5] = NAME_Value;
COUNT [5] = value;
};
5.Content\Story:
npc\klon.d:
PROTOTYPE Mst_Default_Klon(C_Npc) /// Instance Klona opisane na dole skryptu
{
//----- Monster ----
name = "Klon"; //Nazwa
guild = GIL_KLON; //Gildia
aivar[AIV_MM_REAL_ID] = ID_KLON; //Identyfikator
level = 30; //level

//----- Attribute ----
attribute [ATR_STRENGTH] = 150; //Siła
attribute [ATR_DEXTERITY] = 150; //Zręczność
attribute [ATR_HITPOINTS_MAX] = 300; //Maksymalna ilość życia
attribute [ATR_HITPOINTS] = 300; // Aktualna ilość życia
attribute [ATR_MANA_MAX] = 200; //Maksymalna ilość Many
attribute [ATR_MANA] = 200; // Aktualna ilość Many

//----- Protections ----
protection [PROT_BLUNT] = 125; //
protection [PROT_EDGE] = 125;//
protection [PROT_POINT] = 175; // Obrona przed czymś tam to i tak nie ważne
protection [PROT_FIRE] = 125; //Obrona przed ogniem
protection [PROT_FLY] = 125; //Obrona przed uderzeniami typu Troll
protection [PROT_MAGIC] = 50; // Obrona przed Magią
//B_SetAttributesToChapter (self, 6);
Npc_SetTalentSkill (self, NPC_TALENT_MAGE, 6); //że posiada 6 krąg magii

//----- Damage Types ----
damagetype = DAM_EDGE; //Typ obrażeń
// damage [DAM_INDEX_BLUNT] = 0;
// damage [DAM_INDEX_EDGE] = 0;
// damage [DAM_INDEX_POINT] = 0;
// damage [DAM_INDEX_FIRE] = 0;
// damage [DAM_INDEX_FLY] = 0;
// damage [DAM_INDEX_MAGIC] = 0;

//----- Kampf-Taktik ----
fight_tactic = FAI_HUMAN_MASTER; //Styl walki
EquipItem (self, MeleeWeapon); // Posiada broń
EquipItem (self, RangedWeapon); // Posiada Broń
CreateInvItems (self, itrw_bolt, 100); //Tworzy Bełty
CreateInvItems (self, itrw_Arrow, 100); // Tworzy Strzały w eq klona

//----- Senses & Ranges ----
senses = SENSE_HEAR | SENSE_SEE | SENSE_SMELL; //Nawet nie wiem
senses_range = PERC_DIST_MONSTER_ACTIVE_MAX;//Nawet nie wiem

aivar[AIV_MM_FollowTime] = FOLLOWTIME_MEDIUM; //Nawet nie wiem
aivar[AIV_MM_FollowInWater] = FALSE; // coś z wodą

aivar[AIV_MagicKlon] = UseMageKlon; //Zmienna która zmienia aby klon używał magii

//----- Daily Routine ----
start_aistate = ZS_MM_Rtn_Klony; // Rutyna Klona

aivar[AIV_MM_RestStart] = OnlyRoutine;// żeby cały czas był w tej rutynie

};


//*************
// Visuals
//*************

func void B_SetVisuals_Klon()
{

Mdl_SetVisual (self,"HUMANS.MDS");
// ------ Visual ------ "body_Mesh", bodyTex SkinColor headMesh, faceTex, teethTex, armorInstance
Mdl_SetVisualBody (self, "hum_body_Naked0", 9, 0, "Hum_Head_Pony", FACE_N_Player, 0, Plaszcz);

};

//*********************
// Skeleton   Mage
//*********************

INSTANCE Klon (Mst_Default_Klon)
{
  B_SetVisuals_Klon();
};

Story/Startup.d:
func void INIT_GLOBAL()
{
// wird fuer jede Welt aufgerufen (vor INIT_<LevelName>)
Game_InitGerman();
LeGo_Init (LeGo_All);
HookEngineF (7560880,  7, RemoveWeapon);// to musimy skopiować
HookEngineF (7563104,  7, RemoveWeapon);//to to też
if (!FF_Active (Zbroja)) //to też jest to chyba coś jak starter funkcji frame functrions
{//to
FF_Apply (Zbroja);//to też
};//to

};
Story\Text.d:
"Tworzenie Klonów", // 64 SPL_SummonKlon  /// linijka 330


const string NAME_SPL_SummonKlon = "Tworzenie Klonów";   //linika 472

Wyszukaj:

"D" ,

Zmien na;

"KLON"
Scripts\System\VisualFX\VisualFXinst.d:
///Linijka 3077



instance spellFX_SummonKlon (CFx_Base_Proto)
{
visname_S = "MFX_ArmyOfDarkness_INIT";
visAlpha = 1;

emtrjmode_s = "FIXED";
emTrjOriginNode = "ZS_RIGHTHAND";
LightPresetname = "REDAMBIENCE";

};

instance spellFX_SummonKlon_KEY_OPEN(C_ParticleFXEmitKey)
{
LightRange = 0.01;
};

instance spellFX_SummonKlon_KEY_INIT (C_ParticleFXEmitKey)
{
LightRange = 0.01;
};

instance spellFX_SummonKlon_KEY_INVEST_1 (C_ParticleFXEmitKey)
{
LightRange = 200;
emCreateFXID = "FX_EarthQuake";
};
instance spellFX_SummonKlon_KEY_CAST (C_ParticleFXEmitKey)
{
emCreateFXID = "spellFX_SummonCreature_ORIGIN";
pfx_ppsisloopingchg = 1;
};


Skrypt jest dopracowany (Bynajmniej według mnie) w 98% gdyż tylko jesli przywołamy więcej niż 1 klona to czyści eq tylko jednemu, postaram się jeszcze to rozgryźć, kurwa ale się z tym wszystkim namęczyłem xd oddaje to w wasze ręce

Edit: ale gafa Zapomniałem dodać że trzeba zedytować plik Gothic.src a w nim na samym dole przed linijką startup.d wkleić to:
_MOJE\*.d
 
Niebawem...Pierdolnę se poradniki do Goticzka. Albo i nie, bo sie mnie nie chce.

Vanarius

Vanarius

Riquer Team
Początkujący Modder
posty332
Propsy62
ProfesjaGrafik 3D
  • Riquer Team
  • Początkujący Modder
Przydatne :)
 

Splash

Splash

Moderator
posty4209
Propsy3412
ProfesjaNierób
  • Moderator
Z tymi zbrojami nie łatwiej by było zrobić tak?
if (Npc_HasEquippedArmor (hero))
{
Plaszcz = Hlp_GetInstanceID (Npc_GetEquippedArmor(hero));
}
else
{
Placz = NoArmor;
};
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Toworish

Toworish

Użytkownicy
http://chomikuj.pl/ToWoRiSh
posty1664
Propsy254
ProfesjaNierób
  • Użytkownicy
  • http://chomikuj.pl/ToWoRiSh

Toworish

Runa przywołania Klonów
#3 2015-11-01, 22:55(Ostatnia zmiana: 2015-11-10, 14:02)
Aktualne info w pierwszym poście, do skryptu został wykorzystany pomysł splasha
 
Niebawem...Pierdolnę se poradniki do Goticzka. Albo i nie, bo sie mnie nie chce.

Toworish

Toworish

Użytkownicy
http://chomikuj.pl/ToWoRiSh
posty1664
Propsy254
ProfesjaNierób
  • Użytkownicy
  • http://chomikuj.pl/ToWoRiSh
Zaktualizowane info w pierwszym poście :D
 
Niebawem...Pierdolnę se poradniki do Goticzka. Albo i nie, bo sie mnie nie chce.


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry