Djinni Wiki PL
Advertisement

Postaci NPC, gracz i stworzenia[]

Jak zmienić skryptem wygląd postaci?[]

void main()
{
   object oTarget = GetObjectByTag("my_tag");
   int iApearance = 1;
   SetCreatureAppearance(oTarget, iApearance);
}
  • object o Target - postać, na jakiej ma zostać wykonana zmiana wyglądu (może być GetFirstPC())
  • iApearance" - numer z pliku appearance.2da postaci
  • SetCreatureAppearance - funkcja do zmiany postaci

Uwaga: kreatura zmieni tylko wygląd, ale nie np. sety animacji!!

Jeśli chodzi o zmianę appearence Geralta, skrypt powinien wyglądać tak:

void main()
{
   object oTarget = GetFirstPC();
   int iApearance = xxx;
   SetCreatureAppearance(oTarget, iApearance);
}

Jak skryptem wymusić, aby Wiedźmin wyciągnął miecz?[]

void main()
{
   object oPC = GetFirstPC();
   object oItem = GetItemInSlot(INVENTORY_SLOT_STEELSWORD, oPC);
   AssignCommand(oPC, ActionEquipItem(oItem, INVENTORY_SLOT_RIGHTHAND));
}
  • object oPC = GetFirstPC() - gracz
  • object oItem - przedmiot gracz (argumenty: nazwa przedmiotu, postać)
  • AssignCommand - wywołuje funkcję na konkretnej rzeczy/ postaci
  • ActionEguipItem - funkcja, która powoduje użycie danej rzeczy, na konkretnej części

Uwaga: Oczywiście możecie użyć INVENTORY_SLOT_SILVERSWORD zamiast *STEELSWORD.


Czy można za pomocą skryptu zmusić Wiedźmina bądź jakiegoś NPCa by przeszedł z punktu A do punktu B?[]

void main()
{
  object oTarget = GetObjectByTag("moj_tag_postaci");
  object oGoTo = GetObjectByTag("tag_obiektu_docelowego");
  AssignCommand(oTarger, ActionMoveToObject(oGoTo));
}

Zalecane jest przemieszczać postacie, używając actionpointów.


Jak sprawić, żeby postać stanęła przodem do jakiegoś obiektu?[]

void main()
{
   AssignCommand(GetObjectByTag("moja_postac"), SetFacingPoint(GetPosition(GetObjectByTag("moj_obiekt"))));
}

Jak zwrócić dowolną postać twarzą do Geralta za pomocą skryptu?[]

void main()
{
  vector vLookAt = GetPosition(GetFirstPC());
  AssignCommand(GetObjectByTag("kogo_obracamy", SetFacingPoint(vLookAt));
}

Jak za pomocą skryptu ustawić/pobrać Żywotność/Energię postaci?[]

Ustawianie Żywotności:

void main()
{
  SetCurrentVitalityPoints(int Punkty, object Obiekt);
}

Pobieranie Żywotności:

void main()
{
  int Punkty = GetCurrentVitalityPoints(object Obiekt);
}

Ustawianie Energii:

void main()
{
  SetCurrentEndurancePoints(int Punkty, object Obiekt);
}

Pobieranie Energii:

void main()
{
  int Punkty = GetCurrentEndurancePoints(object Obiekt);
}

Jak wykorzystać efekt Mind Control? (Lub inny efekt krytyczny)[]

W grze jest nie używany, ale Wy możecie go użyć. Efekt kontroli umysłu - można go podpiąć jak dodatkowy czar jakiemuś magowi. Co robi? Działa podobnie jak przykładowo efekt Falter, jednakże zamiast przewracać, powoduje, że postać zaczyna bez ładu i składu biegać w kółko, jeśli jest to Wiedźmin - gracz czasowo traci nad nim kontrolę.
Jak to zrobić? Na mapę (najlepiej na arenę walki z magiem) musimy wrzucić w niedalekiej odległości od siebie dziesięć waypointów o tagach wp_magmind. To pomiędzy nimi postać będzie sobie biegać.

Aby nałożyć efekt na postać, postępujemy podobnie jak przy każdym innym efekcie krytycznym (tutaj rzucamy to na postać gracza):

void main()
{
  AddRunningEffect(GetFirstPC(), "MindControl", 0, "Magic", -1.0);
}

Oczywiście zamiast MindControl możemy użyć innego efektu krytycznego, jak np. "Falter", "Blind", "Bleed", etc.


Jak zadać losową ilość obrażeń postaci za pomocą skryptu?[]

void main
{
  int iLos = Random(4);
  effect eDamage = EffectDamage(1.0 + iLos, 10.0, 0.01, "Magic", FALSE);
  ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, GetObjectByTag("tag_postaci"));
}

Jak przenieść Geralta do danego waypointu skryptem?[]

void main()
{
AssignCommand(GetFirstPC(), JumpToObject(GetObjectByTag("tag_waypointa")));
}

Jak ustawić życie geralta na daną ilość pkt?(W moim przypadku 20)[]

void main()
{
  object oPC = GetFirstPC();
SetCurrentVitalityPoints( 20, oPC ); // ustawia aktualna ilość punktów życia u mnie 20

}

Dialogi[]

Jak wymusić rozpoczęcie dialogu?[]

#include "inc_dialog"

void main()
{
 object oTarget = GetObjectByTag("nazwa_NPC");
 TeleportAndTalk(oTarget, "nazwa_dialogu"); // NPC podejdzie i zagada.
}


#include "inc_dialog"

void main()
{
  object oTarget = GetObjectByTag("nazwa_NPC");
  TeleportPCAndTalk(oTarget, "nazwa_dialogu"); // Geralt zagada.
}



Obiekty[]

Jak za pomocą skryptu włączyć/wyłączyć używalność obiektu (np. skrzyni)?[]

void main()
{
  SetPlaceableUsable(GetObjectByTag("tag_obiektu"), FALSE); 
}

Można również zamiast FALSE dać TRUE, jeśli chcemy, aby był używalny.


Jak stworzyć obiekty zapalane/gaszone za pomocą Igni/Aard?[]

#include "inc_ai"
// skrypt podpinamy pod "on spell cast at" placeabla
// Zapalanie/gaszenie ognia czarami Aard oraz Igni.
//                                   (by M "TnZ" K)

// =====================================================================================================

// Dystans swiatel jakie gasimy wokolo obiektu-przy kazdym ognisku mozemy wstawic obiekt dodatkowego swiatla (tag ob_light)
float xDist = 10.0f;
// Tag obiektow ze swiatlami
string xTag = "ob_light";

// =====================================================================================================
 
void PlaceCampfireMappinOnMap(object oCampfire)
{
  // Wrzucamy mappin ogniska na mape - a niech gracze wiedza gdzie to ognisko bylo
  if (GetLocalInt(oCampfire, "HasMarker")!=1 && GetDistanceBetween(GetFirstPC(), oCampfire)<10.0)
  {
     location lCampfire = GetLocation(oCampfire);
     CreateObject(OBJECT_TYPE_WAYPOINT, "wp_campfire", lCampfire, FALSE, "wp_campfire");
     SetLocalInt(oCampfire, "HasMarker", 1);
  }
}

// =====================================================================================================

void FireOn(object oCampfire)
{
        // Wlaczenie wszystkich pobliskich zrodel swiatla
        object nLight = GetNearestObjectByTag(xTag, oCampfire, 0);
        int j = 0;
        while (nLight != OBJECT_INVALID)
           {
              j++;
              nLight = GetNearestObjectByTag(xTag, oCampfire, j);
              float iDist2 =  GetDistanceBetween(nLight, oCampfire);
              if (iDist2 < xDist && GetArea(OBJECT_SELF)==GetArea(nLight))  
              {
                 // Zapalamy swiatlo w poblizu tego zrodla
                 DClearAllActions(FALSE, nLight);
                 ChangePlaceableEffectPhase(nLight, "Cast");
              }
           }
     // Przelaczamy animacje Placeable'a na ACTIVATE
     DClearAllActions(FALSE, oCampfire);
     AssignCommand(oCampfire, ActionPlayAnimation(ANIMATION_PLACEABLE_ACTIVATE, 1.0, 10000.0));
     ChangePlaceableEffectPhase(oCampfire, "Cast");
     DeleteLocalInt(oCampfire, "iRainOff"); // ta zmienna jest wykorzystywana przy gaszeniu ognisk i innych zrodel swiatla gdy pada deszcz
}

// =====================================================================================================

void FireOff(object oCampfire)
{
  // Wylaczenie wszystkich pobliskich zrodel swiatla
  object nLight = GetNearestObjectByTag(xTag, oCampfire,  0);
  int j = 0;
  while (nLight != OBJECT_INVALID)
     {
        j++;
        nLight = GetNearestObjectByTag(xTag, oCampfire, j);
        float iDist2 =  GetDistanceBetween(nLight, oCampfire);
        if (iDist2 < xDist) 
        {
           // Gasimy swiatlo w poblizu tego zrodla
           DClearAllActions(FALSE, nLight);
           ChangePlaceableEffectPhase(nLight, "FadeOut");
        }
     }
  // Przelaczamy animacje Placeable'a na DEACTIVATE
  DClearAllActions(FALSE, oCampfire);
  AssignCommand(oCampfire, ActionPlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE, 1.0, 1000.0));
  ChangePlaceableEffectPhase(oCampfire, "FadeOut");
  SetLocalInt(oCampfire, "iRainOff", 1);
}

// =====================================================================================================
// [                                                                                          ]
// [                              SpellCastAt ognisk/pochodni/innych palacych sie zrodel  swiatla.                              ]
// [                                                                                          ]
// =====================================================================================================

void main()
{
  int nSpellId = GetLastSpell();
  if(nSpellId >= 0 && nSpellId <= 9 ) // aard gasi ognisko
  {
     FireOff(OBJECT_SELF);
  }
  
  if(nSpellId >= 30 && nSpellId <= 39 ) // igni zapala ognisko
  {
     FireOn(OBJECT_SELF);
  }
}


Jak wyświetlić opis obiektu dekoracyjnego po kliknięciu na niego przez gracza?[]

Pod OnUsed placeabla (np. drogowskazu) podepnij skrypt:

void main()
{
  string sTag = GetTag(OBJECT_SELF);
  string sOperation = "displayTooltipForObject('" + sTag + "')";
  RunClientLua( sOperation );
}


Jak wyświetlić nad głową postaci/nad placeablem dowolny ciąg znaków? Np odliczanie do wybuchu bomby?[]

void main()
{
   AssignCommand(GetObjectByTag("nad_czym_piszemy"), SpeakString("..."+sInfo+"..." ) );
}

Taki napis (string - łańcuch znaków) nie może się zaczynać od liczby, stąd te kropki na początku. Nie jest to używane w Wiedźminie, ponieważ funkcja nie obsługuje wersji językowych - będzie w takim języku, w jakim to wpiszesz w skrypcie.



Efekty specjalne, dźwięki i animacje[]

Jak skryptem odpalić efekt tzw. camera shake?[]

#include "inc_cameffects"
void main()
{
  CameraShake(0.1, 0.07, 0.3);
}


Jak w prosty sposób odpalić dowolną animację postaci ze skryptu (np. pozdrowienie ręką)?[]

To całkiem proste. Wystarczy otworzyć postać i wybrać sobie odpowiednią animację ([1]), którą chcemy wykorzystać. Duplikujemy ją jako animację wirtualną o nazwie special1 (mamy jeszcze do wykorzystanie special2, special3, special4 oraz special5). Następnie możemy tę animację odtworzyć na postaci ze skryptu, używając funkcji:

void main()
{
 AssignCommand(object Target, ActionPlayAnimation(ANIMATION_FIREFORGET_SPECIAL1));
}
  • AssignCommand - specjalna funkcja, która wykonuje akcję na podanej rzeczy
  • object oTarget - podajemy postać, na której ma zostać wykonana animacja
  • ActionPlayAnimation - odpala animację


Jak ze skryptu odtworzyć dźwięk?[]

Jeśli mamy w module zapisany przykładowo moj_dzwiek.ogg, wykorzystujemy taką oto funkcję :

void main()
{
  PlaySound("moj_dwiek", 1);
}

Niestety będzie to dźwięk monofoniczny, nie pozycjonowany w 3d. Jeśli chcemy takowy - musimy stworzyć template dźwięku i zrobić spawn tego obiektu np. na jakiś waypoint.


Jak za pomocą skryptu stworzyć efekt cząsteczkowy na obiekcie dekoracyjnym?[]

Jeśli mamy obiekt o tagu moj_obiekt użycie funkcji:

void main()
{
  CreateVisualEffectAtObject("fx_kurz02", "", GetObjectByTag("moj_obiekt"));
}

spowoduje jego "zakurzenie".


Jak sprawić, aby obiekt dymił, gdy rzucę na niego Igni?[]

#include "inc_ai"
// skrypt podpinamy pod "on spell cast at" placeabla
// obiekt zaczyna dymic po rzuceniu na niego igni (by tnz)
void main()
{
  int nSpellId = GetLastSpell();
  
     if(nSpellId >= 30 && nSpellId <= 39 ) //  igni
     {
         location lLoc = GetLocation(OBJECT_SELF);
         CreateVisualEffectAtLocation("fx_fume01", lLoc);
     }
}


Jak za pomocą skryptu stworzyć efekt, który leci w stronę postaci (np. efekt ranienia Dagona przez jego wyznawców)?[]

Musimy stworzyć ten efekt na którejś z postaci, przykładowo:

void main()
{
   CreateVisualEffectAtCreature("fx_dgndmg01", "", GetObjectByTag("tag_postaci_od_ktorej_leci"), FALSE);
}
//Potem musimy sprawic aby efekt sie przemiescil do drugiej postaci:
BindEffectParamToPartPosition(GetObjectByTag("tag_postaci_od_ktorej_leci"), "fx_dgndmg01", "monstercon01", GetObjectByTag("tag_postaci_do_ktorej_leci"), "head_g");
  • fx_dgndmg01 - efekt musi być specjalny, nie każdy tutaj zadziała.
  • head_g - można też przypiąć do innej kości - tutaj efekt będzie zmierzał do głowy. Listę kości można zobaczyć w model viewerze.


Jak ściemnić/rozjaśnić ekran za pomocą skryptu?[]

void main()
{
  FadeToBlack(oPC, FADE_SPEED_FASTEST); //zaciemnianie ekranu
  DelayCommand(1.0, FadeFromBlack(oPC, FADE_SPEED_MEDIUM)); //rozjasnienie ekranu/span>
}



Sztuczki skryptowe[]

Czy istnieje jakaś funkcja, która usypia skrypt na podaną ilość milisekund? Coś jak sleep() w C++.[]

Nie do końca, ale można do tego użyć funkcji DelayCommand. Np:

void Moja_odpalana_za_jakis_czas_funkcja()
{
  // cos tam sie tutaj dzieje
}
void main()
{
  float fCzas = 10.0;
  DelayCommand(fCzas, Moja_odpalana_za_jakis_czas_funkcja());
}


Jak stworzyć skrypt warunkowy, wykorzystywany np. w dialogach?[]

int StartingConditional()
{
  if(_JAKIS_WARUNEK_DO_SPELNIENIA_TUTAJ_)
  {
     return 1;
  }
  else
  {
     return 0;
  }
}

Ten skrypt nie zaczyna się od void main() tak jak inne skrypty, a od int StartingConditional().

Advertisement