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().