Czasowa nieśmiertelność 8361 31

O temacie

Autor Jastrzab

Zaczęty 24.12.2010 roku

Wyświetleń 8361

Odpowiedzi 31

Jastrzab

Jastrzab

Użytkownicy
posty197
Propsy39
Profesjabrak
  • Użytkownicy
Hej, mam taki pomysł ale nie wiem do końca jak go wykonać. Zrobiłem miksturę i funkcję i chciałbym do funkcji dodać nieśmiertelność na 2 minuty. Podpatrywałem consta Time_Speed w skrypcie mikstury przyśpieszenia ale nie wiem jak ją wstawić aby na jakiś czas zmieniły się FLAGS bohatera na FLAG_NPC_IMMORTAL. Ma ktoś jakiś pomysł?
 
CPU: Intel Core i7 8700k
RAM: G.Skill Ripjaws 16GB 3000MHz CL15
GPU: MSI GTX 1060 6GB
Mobas: MSI Z370 Gaming Pro Carbon

Zkirtaem

Zkirtaem

Moderator
Mięso
posty2171
Propsy1689
ProfesjaGracz
  • Moderator
  • Mięso
ja z moim kombinatorskim podejściem bym zrobił w pętli tick-tock, że if (jakaśzmiennacosięzmieninazeropodwóchminutach = 1) to ustawia życie na życie.max ciągle. Jeśli umiesz zrobić tick-tocka to to najprostsze wyjście, jakie znam, ale pewnie da się jakoś flagę zmienić prościej.
 

orcwarrior

orcwarrior

The Modders
posty475
Propsy317
Profesjabrak
  • The Modders

orcwarrior
The Modders

Czasowa nieśmiertelność
#2 2010-12-24, 17:42(Ostatnia zmiana: 2010-12-24, 17:44)
Cytat: mea link=topic=12515.msg125443#msg125443#msg125443#msg125443 date=1293207130
ja z moim kombinatorskim podejściem bym zrobił w pętli tick-tock, że if (jakaśzmiennacosięzmieninazeropodwóchminutach = 1) to ustawia życie na życie.max ciągle. Jeśli umiesz zrobić tick-tocka to to najprostsze wyjście, jakie znam, ale pewnie da się jakoś flagę zmienić prościej.

Latwiej chyba zrobic zmienna która odrazu jest licznikiem czyli przy wypiciu mikstury
Czas_Niesmiertelnosc_Sek = 2 * 60; //120s - 2m
w triggerze wykonywanym co 1sek (lub innym, wtedy trzeba odp. dobrac pocz. wartosc zmiennej)
dać
np.
if(Czas_Niesmiertelnosc_Sek)
{
Czas_Niesmiertelnosc_Sek-=1;//odejmij kolejna sekunde <div><span class="Apple-tab-span" style="white-space:pre"> </span>//(lub jej czesc jezeli opoznienie triggera inne niz 1sek)
if(Czas_Niesmiertelnosc_Sek==0)
{
Wylacz_Niesmiertelnosc();
};
};

w wypadku npctów sprawa jest już znacznie bardziej skomplikowana, dlatego dla poczatkujacych - NIE POLECAM.
 



inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Czasowa nieśmiertelność
#3 2010-12-24, 18:24(Ostatnia zmiana: 2010-12-24, 18:32)
Co do npc'ów, wydaje mi się że można by wykorzystać któryś z aivarów 43-50 do zapisania zmiennej z czasem trwania nieśmiertelności (czyli jako licznika pętli). Może nawet dałoby się wykorzystać overlay TA (chociaż szczerze mówiąc, nie pamiętam jak dokładnie powinno to działać) i wtedy obejść się bez triggerów.

Jastrzab

Jastrzab

Użytkownicy
posty197
Propsy39
Profesjabrak
  • Użytkownicy
Jutro sprawdzę oba sposoby i napiszę czy coś udało mi się osiągnąć  :D
 
CPU: Intel Core i7 8700k
RAM: G.Skill Ripjaws 16GB 3000MHz CL15
GPU: MSI GTX 1060 6GB
Mobas: MSI Z370 Gaming Pro Carbon

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Czasowa nieśmiertelność
#5 2010-12-25, 12:42(Ostatnia zmiana: 2010-12-25, 12:50)
Sprawdziłem to overlay TA, niestety z tego co zobaczyłem jest to twór dość dziwny, użyty w grze dwa razy i raczej nie przypominający mechanizmem overlay MDS'ów (czyli że jakby nakłada coś dodatkowego, a nie zastępuje całkowicie starego). Może jednak cię zainteresować funkcja Npc_GetStateTime.

Szczerze mówiąc pierwszy raz widzę w Daedalusie strukturę tego typu co zastosowana w tym overlay TA, nie mogę sprawdzić jak w ogóle dokładnie działa bo nie mam Gothica. Gdyby ktoś był zainteresowany, jest stosowana w ten sposób:
Spoiler
var C_NPC Stone; Stone = Hlp_GetNpc ( GRD_219_Stone );

TA_BeginOverlay (Stone);
TA_Min (Stone, 00, 00, 00, 05, ZS_Position,"OCC_MERCS_HALLWAY_BACK" );
TA_Min (Stone, 00, 05, 00, 10, ZS_Position,"OCC_MERCS_ENTRANCE" );
TA_Min (Stone, 00, 10, 00, 15, ZS_Position,"OCC_SHADOWS_CORNER" );
TA_Min (Stone, 00, 15, 00, 20, ZS_Position,"OCC_STABLE_ENTRANCE" );
TA_Min (Stone, 00, 20, 72, 00, ZS_Position,"OCC_STABLE_LEFT_FRONT" );
TA_EndOverlay (Stone);
TA_BeginOverlay (self);
TA_Stay (00,00,00,55,"PSI_PATH_9_4");
TA_EndOverlay (self);
TA_BeginOverlay (self);
TA_Stay(00,00,01,00,"PSI_32_HUT_EX");  
TA_EndOverlay (self);
Itd.
Z tego co mogę się domyślać, działa na tej zasadzie że zastępuje tylko te godziny, które zostały w niej po raz kolejny zdefiniowane, pozostałe zostawiając według normalnego schematu.

BTW: Czy tylko mi nie pasuje godzina "72" podana w ostatnim przedziale rutyny Stone'a?

Jastrzab

Jastrzab

Użytkownicy
posty197
Propsy39
Profesjabrak
  • Użytkownicy
Próbowałem zrobić to w Tick Tocku, wstawiłem zmienną która odejmuje się o 1 od 120 i potem zmieniają się flags na 0 ale nadal nie działa ;/. Zamiast w tick tocku to dałem też ten skrypt do items pod func void Use_mikstura ale też nie działa. Może coś źle robie. Jeśli potrzebujecie mogę wkleić skrypty jakie napisałem.
 
CPU: Intel Core i7 8700k
RAM: G.Skill Ripjaws 16GB 3000MHz CL15
GPU: MSI GTX 1060 6GB
Mobas: MSI Z370 Gaming Pro Carbon

orcwarrior

orcwarrior

The Modders
posty475
Propsy317
Profesjabrak
  • The Modders
Cytat: Jastrzab link=topic=12515.msg125558#msg125558#msg125558#msg125558 date=1293283984
Próbowałem zrobić to w Tick Tocku, wstawiłem zmienną która odejmuje się o 1 od 120 i potem zmieniają się flags na 0 ale nadal nie działa ;/. Zamiast w tick tocku to dałem też ten skrypt do items pod func void Use_mikstura ale też nie działa. Może coś źle robie. Jeśli potrzebujecie mogę wkleić skrypty jakie napisałem.

Pokaż te skrypty.
 



Jastrzab

Jastrzab

Użytkownicy
posty197
Propsy39
Profesjabrak
  • Użytkownicy
Skrypt mikstury:

INSTANCE ItPo_Lzy_smoka (C_Item)
{
name = "Łzy Smoka";

mainflag = ITEM_KAT_POTIONS;
flags = ITEM_MULTI;

value = 3000;

visual = "ItPo_Perm_STR.3ds";
material = MAT_GLAS;

on_state[0] = UseItPo_Lzysmoka;
scemeName = "POTIONFAST";

wear = WEAR_EFFECT;
effect = "SPELLFX_MANAPOTION";

description = name;

TEXT[1] = "Silny wywar ze smoczej krwi i esencji ze smoczego jaja";

TEXT[3] = "Efekty nieznane...";

TEXT[5] = NAME_Value;
COUNT[5] = value;

};

FUNC VOID UseItPo_Lzysmoka()
{

Npc_ChangeAttribute(self,ATR_MANA,-50);
Npc_ChangeAttribute(self,ATR_STRENGTH,+30);

Wld_PlayEffect ("SLOW_TIME", self, self, 0, 0, 0, FALSE);


PrintScreen ("Siła +30", -1, 35, FONT_Screen, 2);
PrintScreen ("Mana -50", -1, 38, FONT_Screen, 2);

Czas_Niesmiertelnosc_Sek = 120;


};


Skrypt Tick_Tock:

func void tick_tock()
{

if(Czas_Niesmiertelnosc_Sek == 120)
{
        self.flags = NPC_FLAG_IMMORTAL;

        Czas_Niesmiertelnosc_Sek-=1;

        if(Czas_Niesmiertelnosc_Sek == 0)
        {
                self.flags = 0;
        };
};
};
 
CPU: Intel Core i7 8700k
RAM: G.Skill Ripjaws 16GB 3000MHz CL15
GPU: MSI GTX 1060 6GB
Mobas: MSI Z370 Gaming Pro Carbon

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Czasowa nieśmiertelność
#9 2010-12-25, 15:09(Ostatnia zmiana: 2010-12-25, 15:16)
LOL, przeczytaj to sobie. Zmniejszy ci zmienną o 1, tylko jeśli w danej chwili wynosiła 120. Czyli zmniejszy się tylko do 119 i stanie. A warunek żeby było równe 120 i jednocześnie 0, nie spełni się NIGDY.

Poprawnie:
func void tick_tock()
{
if(Czas_Niesmiertelnosc_Sek != 0)
{ self.flags = 2; Czas_Niesmiertelnosc_Sek-=1; }
else
{ self.flags = 0; };
};

Właściwie to gdyby miało to by do użycia przez NPC którzy mają także inne flagi, zamiast czyszczenia powinno się wykorzystać negację bitową, z tym że nie jestem pewien czy tak się to zapisywało:
else
{ self.flags = self.flags &~ 2; };

orcwarrior

orcwarrior

The Modders
posty475
Propsy317
Profesjabrak
  • The Modders
if(Czas_Niesmiertelnosc_Sek == 120)
gdybyś przezpisał tak jak napisałem, tzn:

if(Czas_Niesmiertelnosc_Sek)[/size][/font]
Wszystko było by tak jak trzeba, taki warunek oznacza to samo co
Czas_Niesmiertelnosc_Sek != 0 [/size][/font]
lub:
Czas_Niesmiertelnosc_Sek > 0[/size][/font]
 



Jastrzab

Jastrzab

Użytkownicy
posty197
Propsy39
Profesjabrak
  • Użytkownicy

Jastrzab

Czasowa nieśmiertelność
#11 2010-12-25, 20:38(Ostatnia zmiana: 2010-12-28, 15:52)
FUNC VOID UseItPo_Lzysmoka()
{

Npc_ChangeAttribute(self,ATR_MANA,-50);
Npc_ChangeAttribute(self,ATR_STRENGTH,+30);

Wld_PlayEffect ("SLOW_TIME", self, self, 0, 0, 0, FALSE);


PrintScreen ("Siła +30", -1, 35, FONT_Screen, 2);
PrintScreen ("Mana -50", -1, 38, FONT_Screen, 2);

No dobra a co z tym? - Czas_Niesmiertelnosc_Sek = 120;


};
 
CPU: Intel Core i7 8700k
RAM: G.Skill Ripjaws 16GB 3000MHz CL15
GPU: MSI GTX 1060 6GB
Mobas: MSI Z370 Gaming Pro Carbon

Jastrzab

Jastrzab

Użytkownicy
posty197
Propsy39
Profesjabrak
  • Użytkownicy
 
CPU: Intel Core i7 8700k
RAM: G.Skill Ripjaws 16GB 3000MHz CL15
GPU: MSI GTX 1060 6GB
Mobas: MSI Z370 Gaming Pro Carbon

Wowoz

Wowoz

Użytkownicy
Wowoźny
posty3698
Propsy4862
NagrodyVV
Profesjabrak
  • Użytkownicy
  • Wowoźny
Moze zrob tick tocka, ktory w odpowiednim momencie gry (wtedy gdy chcesz niesmiertelnosc) bedzie sprawdxal czy herowi odejmuje się hp. Jezeli tak to bedzie dodawal hp + 99999
 

Jastrzab

Jastrzab

Użytkownicy
posty197
Propsy39
Profesjabrak
  • Użytkownicy

Jastrzab

Czasowa nieśmiertelność
#14 2010-12-28, 17:10(Ostatnia zmiana: 2010-12-28, 20:13)
Cytuj
Moze zrob tick tocka, ktory w odpowiednim momencie gry (wtedy gdy chcesz niesmiertelnosc) bedzie sprawdxal czy herowi odejmuje się hp. Jezeli tak to bedzie dodawal hp + 99999

Ale tak to on będzie dodawać HP cały czas a nie np. przez 60 sekund i przestanie.
 
CPU: Intel Core i7 8700k
RAM: G.Skill Ripjaws 16GB 3000MHz CL15
GPU: MSI GTX 1060 6GB
Mobas: MSI Z370 Gaming Pro Carbon


Jastrzab

Jastrzab

Użytkownicy
posty197
Propsy39
Profesjabrak
  • Użytkownicy

Jastrzab

Czasowa nieśmiertelność
#16 2010-12-29, 01:00(Ostatnia zmiana: 2010-12-29, 01:00)
FUNC VOID UseItPo_Lzysmoka()
        {
               
                Npc_ChangeAttribute(self,ATR_MANA,-50);
                Npc_ChangeAttribute(self,ATR_STRENGTH,+30);

                Wld_PlayEffect ("SLOW_TIME", self, self, 0, 0, 0, FALSE);


                PrintScreen ("Siła +30", -1, 35, FONT_Screen, 2);
                PrintScreen ("Mana -50", -1, 38, FONT_Screen, 2);

          Czas_Niesmiertelnosc_Sek = 120;


};

Ale co mam zrobić z tym? Zmienić czy co bo jak nie dam jest źle. Opieram się na tick tocku Avallacha:

Czas_Niesmiertelnosc_Sek = 120;
 
CPU: Intel Core i7 8700k
RAM: G.Skill Ripjaws 16GB 3000MHz CL15
GPU: MSI GTX 1060 6GB
Mobas: MSI Z370 Gaming Pro Carbon

orcwarrior

orcwarrior

The Modders
posty475
Propsy317
Profesjabrak
  • The Modders
Co jest źle? jak czego nie dasz? czym się obiawia? jeźeli mamy ci pomóc rozwijaj choć troche swoje wypowiedzi.
No i tak własciwie co ty chcesz osiagnąc? czy postac ma być tylko niesmiertelna tymczasowo?
 



Jastrzab

Jastrzab

Użytkownicy
posty197
Propsy39
Profesjabrak
  • Użytkownicy
Tak ma być nieśmiertelna przez 120 sekund po wypiciu mikstury której działanie podałem wyżej. A tick tock jakoś mi nie działa.
 
CPU: Intel Core i7 8700k
RAM: G.Skill Ripjaws 16GB 3000MHz CL15
GPU: MSI GTX 1060 6GB
Mobas: MSI Z370 Gaming Pro Carbon

orcwarrior

orcwarrior

The Modders
posty475
Propsy317
Profesjabrak
  • The Modders
Cytat: Jastrzab link=topic=12515.msg126436#msg126436#msg126436#msg126436 date=1293585215
Tak ma być nieśmiertelna przez 120 sekund po wypiciu mikstury której działanie podałem wyżej. A tick tock jakoś mi nie działa.

w ticktocku (poza ifami, moze byc na poczatku dodaj)
PRINT("MOJ TICK_TOCK JEST SPRAWNY!");
jezeli bedzie pojawiala sie taka linijka na ekranie jest ok, jezeli nie zle dodales triggera do world.zen (czy innego zena z ktorego korzystasz)
 




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