Nowy rodzaj artefaktu 6002 17

O temacie

Autor Dawidek

Zaczęty 18.08.2009 roku

Wyświetleń 6002

Odpowiedzi 17

Dawidek

Dawidek

Użytkownicy
posty29
  • Użytkownicy
Czy ktoś wie ( w G1 oczywiście) co trzeba zrobić żeby można było założyć tylko jedną sztukę jednocześnie(podobnie jak amulet) nowy typ artefaktu(w tym wypadku pas). Bo aktualnie to mogę tych pasów zakładać w nieskończoność.
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Nowy rodzaj artefaktu
#1 2009-08-19, 08:26(Ostatnia zmiana: 2009-08-19, 08:50)
Wiem jak zrobić całe wykrywanie że nie można dłużej zakładać, trzeba by jeszcze znaleźć funkcję na automatyczne ściągnięcie tego co nałożyliśmy ponad miarę, niestety istnieje ona tylko dla bronii i zbroi. Musiałbyś potraktować pas jako taką zbroję i w momencie wykrycia że próbujesz nałożyć dwa na raz, ściągało by wszystko.

var int pas_equipped;FUNC VOID Equip_pas()
{
if pas_equipped == TRUE
{
PrintScreen ("Nie możesz nosić dwóch pasów na raz!", -1,-1,"FONT_OLD_20_WHITE.TGA",3);
AI_UnequipArmor (hero);
pas_equipped = FALSE;
}
else
{
pas_equipped = TRUE;
};
};

FUNC VOID UnEquip_pas()
{
pas_equipped = FALSE;
};
Dla każdego pasa musisz wtedy ustawić
mainflag = ITEM_KAT_ARMOR;
Ewentualnie, możesz do wszystkich pasów dodać dodatkowy wymagany atrybut, który normalnie ma wartość zero, ale kiedy założysz już jeden pas, to wymaganie dla wszystkich rosłoby do 9999. Kiedy go ściągasz, to drugie wymaganie znowu malałoby do 0. Tyle że wtedy za każdym razem kiedy ktoś próbuje nałożyć drugi pas, pojawiałby się napis typu "Brakuje ci 9978 punktów siły".

Aha, jeśli ponadto chcesz aby pasy miały przy zakładaniu jeszcze inne funkcje wywoływane, to zamiast ustawiać te jako właściwości parametru on_equip i on_unequip, po prostu zagnieźdź w tamtych funkcjach ich wywołania:

Equip_pas ();

UnEquip_pas ();

Dawidek

Dawidek

Użytkownicy
posty29
  • Użytkownicy
Nie no spoko. No łajnie niby wszystko działa, ale po 1: trzeba dodać linie wear, po 2: trzeba dać przy wear nie torso tylko head żeby można było założyć jednocześnie pas i armor, ale po 3 i osttnie tki jest tego efekt

http://www.fotosik.pl/pokaz_obrazek/1b66c16709c964c5.html

nie wiem czy widać ale bezi wygląda jak ufo :lol2:

Więc mam pytanie. Czy da się wyłączyć opcję wear albo zmienić ją na jakąś inną np. WEAR_LEGS i wtedy przedmiotu nie widać.

A tak poza tym to dzięki bo chyba nigdy bym nie wpadł jak to napisać, ale na przyszłość będę już wiedział jak pisać podobne rzeczy.  :)
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
trzeba dodać linie wear, po 2: trzeba dać przy wear nie torso tylko head żeby można było założyć jednocześnie pas i armor
Ja bym tam z tego zrezygnował. Mainflag daj ITEM_KAT_ARMOR a jako flags daj 0, powinno pomóc. Nawet w Gothic II założone pasy nie były widoczne i uważam to za niepotrzebne. Ewentualnie, zawsze można zedytować mesh pasa w programie do obróbki 3D, polecam darmowy Wings 3D. Co do nakładania na inną część ciała niestety to niemożliwe, w każdym razie bez baardzo zaawansowanego grzebania w plikach, standardowo Gothic dopuszcza następujące miejsca zakładania:
//
// ARMOR FLAGS  
//
CONST INT WEAR_TORSO =  1; //Oberkoerper ( Brustpanzer )
CONST INT WEAR_HEAD =  2;

Dawidek

Dawidek

Użytkownicy
posty29
  • Użytkownicy
Ustawienie flags = 0; to był mój pierwszy krok. Ale po wejściu do gry i założeniu pasa wyrzuca mnie z gry i w erroru pisze  ble ble ble wear coś tam. Więc drogom dedukcji doszedłem że brakuje funkcji wear. I rzeczywiście gra chodziła, ale efekt był taki jak na zdjęciu wyżej.
 

Dawidek

Dawidek

Użytkownicy
posty29
  • Użytkownicy
Jest jakiś sposób żeby pasek był widoczny tylko w eq i po wyrzuceniu, a nie kiedy się go założy???
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Nowy rodzaj artefaktu
#6 2009-08-21, 08:40(Ostatnia zmiana: 2009-08-21, 09:55)
Wystarczy nie dodawać parametru "wear". W ogóle, tak samo jak nie mają go choćby amulety. Nie pisałem nic o nim, sam wymyśliłeś że powinien być. Już sam nie wiem co zrobić z flags, czy jesteś pewien że to zmiana na zero spowodowała błąd? Jakie były ostatnie linie przed błędem w zSpy? Przecież wszystkie zbroje standardowo mają 0 i nic się nie dzieje. Może dałeś w cudzysłowie (a nie powinieneś)?

Dawidek

Dawidek

Użytkownicy
posty29
  • Użytkownicy

Dawidek

Nowy rodzaj artefaktu
#7 2009-08-21, 19:09(Ostatnia zmiana: 2009-08-21, 19:27)
instance Pas_straznika(C_Item)
{
name = "Pas Strażnika";

mainflag = ITEM_KAT_ARMOR;
flags = 0;

value = 1000;

visual = "ItMi_Belt_08.3ds";

visual_skin = 0;
material = MAT_METAL;
on_equip = Equip_Pas_straznika;
on_unequip = UnEquip_Pas_straznika;

description = name;
TEXT[1] = "Premia ze Zbroją Strażnika";
COUNT[1] = 5;
TEXT[2] = NAME_Prot_Point;
COUNT[2] = 5;
TEXT[3] = NAME_Prot_Edge;
COUNT[3] = 5;
TEXT[5] = NAME_Value;
COUNT[5] = value;
};

FUNC VOID Equip_Pas_straznika()
{
if pas_equipped == TRUE
{
PrintScreen ("Nie możesz nosić dwóch pasów na raz!", -1,-1,"FONT_OLD_20_WHITE.TGA",3);
AI_UnequipArmor (hero);
pas_equipped = FALSE;
}
else
{
GRD_Equipped = TRUE;
pas_equipped = TRUE;

self.protection[PROT_EDGE] += 5;
self.protection[PROT_BLUNT] += 5;
self.protection[PROT_POINT] += 5;

if (GRDArmor_Equipped == TRUE)
{
self.protection[PROT_EDGE] += 5;
self.protection[PROT_BLUNT] += 5;
self.protection[PROT_POINT] += 5;
self.protection[PROT_MAGIC] += 5;
self.protection[PROT_FIRE] += 5;
};
};
};
FUNC VOID UnEquip_Pas_straznika()
{
GRD_Equipped = FALSE;
pas_equipped = FALSE;

self.protection[PROT_EDGE] -= 5;
self.protection[PROT_BLUNT] -= 5;
self.protection[PROT_POINT] -= 5;

if (GRDArmor_Equipped == TRUE)
{
self.protection[PROT_EDGE] -= 5;
self.protection[PROT_BLUNT] -= 5;
self.protection[PROT_POINT] -= 5;
self.protection[PROT_MAGIC] -= 5;
self.protection[PROT_FIRE] -= 5;
};
};

Tak wygląda przykładowy pas. Gra działa elegancko, ale jak zakładam go w trakcje gry, wywala mnie i wyskakuje błąd o treści
(coś tam w nawiasie po niemiecku) up... coś tam 'wear'-wert von Pas straznika

Więc to 100% nie jest wina flags i ja tak nie pisałem :D

Nie zapominaj o tagach code,
Adanos
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Nigdzie nie widziałem w skryptach pasów, czegoś takiego:
mainflag = ITEM_KAT_ARMOR;
flags = 0;
Ale za to jest tak:
mainflag = ITEM_KAT_MAGIC;
flags = ITEM_BELT|ITEM_MULTI;

Dawidek

Dawidek

Użytkownicy
posty29
  • Użytkownicy
To jest G1 więc pasy to nowość dlatego nie wiem czy to zadziała ale spróbuje.
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
ITEM_BELTraczej nie będzie działać. Tak więc zostaw samo
ITEM_MULTI

Dawidek

Dawidek

Użytkownicy
posty29
  • Użytkownicy

Dawidek

Nowy rodzaj artefaktu
#11 2009-08-21, 19:45(Ostatnia zmiana: 2009-08-21, 19:48)
Wiem, ale jak wcześniej kombinowałem to wstawiłem w constants const int ITEM_PAS.
Ale tak czy siak mogę nadal zakładać pasy w nieskończoność.
Najlepsza opcja to z ITEM_KAT_ARMOR, a w wear WEAR_HEAD, ale w tedy bezi wygląda jak satelita. :D

EDIT
Ewentualnie mogę zrezygnować z wyglądu i w tedy w visual wstawić jakiś pierścień, no ale zależało mi żeby wygląd został zachowany w  eq i jak sie go wyrzuci na ziemie ;)
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Nowy rodzaj artefaktu
#12 2009-08-21, 20:54(Ostatnia zmiana: 2009-08-21, 21:04)
Zrób jak powiedział Adanos.
instance Pas_straznika(C_Item)
{
name = "Pas Strażnika";

mainflag = ITEM_KAT_ARMOR;
flags = ITEM_MULTI;

value = 1000;

visual = "ItMi_Belt_08.3ds";

visual_skin = 0;
material = MAT_METAL;
on_equip = Equip_Pas_straznika;
on_unequip = UnEquip_Pas_straznika;

description = name;
TEXT[1] = "Premia ze Zbroją Strażnika";
COUNT[1] = 5;
TEXT[2] = NAME_Prot_Point;
COUNT[2] = 5;
TEXT[3] = NAME_Prot_Edge;
COUNT[3] = 5;
TEXT[5] = NAME_Value;
COUNT[5] = value;
};

FUNC VOID Equip_Pas_straznika()
{
if pas_equipped == TRUE
{
PrintScreen ("Nie możesz nosić dwóch pasów na raz!", -1,-1,"FONT_OLD_20_WHITE.TGA",3);
AI_UnequipArmor (hero);
pas_equipped = FALSE;
}
else
{
GRD_Equipped = TRUE;
pas_equipped = TRUE;

self.protection[PROT_EDGE] += 5;
self.protection[PROT_BLUNT] += 5;
self.protection[PROT_POINT] += 5;

if (GRDArmor_Equipped == TRUE)
{
self.protection[PROT_EDGE] += 5;
self.protection[PROT_BLUNT] += 5;
self.protection[PROT_POINT] += 5;
self.protection[PROT_MAGIC] += 5;
self.protection[PROT_FIRE] += 5;
};
};
};

FUNC VOID UnEquip_Pas_straznika()
{
GRD_Equipped = FALSE;
pas_equipped = FALSE;

self.protection[PROT_EDGE] -= 5;
self.protection[PROT_BLUNT] -= 5;
self.protection[PROT_POINT] -= 5;

if (GRDArmor_Equipped == TRUE)
{
self.protection[PROT_EDGE] -= 5;
self.protection[PROT_BLUNT] -= 5;
self.protection[PROT_POINT] -= 5;
self.protection[PROT_MAGIC] -= 5;
self.protection[PROT_FIRE] -= 5;
};
};

Aha, materiał zmieniłbym z mat na leather, to tylko różnica w dźwięku upuszczania, ale zawsze.
To bardzo dziwne że nadal mogłeś nakładać je w nieskonczoność, skrypt który napisałem ci na początku pilnuje żeby był tylko jeden pas na raz, a jak coś to ściąga wszystkie. Jest prosty w działaniu i nie powinien zawodzić. Przy zakładaniu drugiego pasa wszystko powinno zostać przez niego jednocześnie ściągnięte i powinien się pojawić stosowny napis. Nic takiego się nie dzieje?

Dawidek

Dawidek

Użytkownicy
posty29
  • Użytkownicy
Analogicznie co wyżej. Wyrzuca mnie z gry gdy zakładam pas.
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Bardzo dziwne.Widocznie jednak się myliłem i parametr wear jest obowiązkowy. Są dwa wyjścia. Dodaj go, ale pozostaw pusty:
wear =;Może chociaż to pomoże. Jeśli nie, będziesz musiał dać head i tak zmodyfikować mesh żeby go nie było widać. Jeśli znasz się trochę na modelowaniu 3D, zrób model w kształcie płaskiego prostokąta i obróć go tak, aby po założeniu był akurat schowany wewnątrz głowy. Nic innego mi na myśl nie przychodzi.

Zysk

Zysk

Użytkownicy
posty606
Propsy451
  • Użytkownicy

Zysk

Nowy rodzaj artefaktu
#15 2009-08-23, 14:17(Ostatnia zmiana: 2009-08-28, 13:51)
niestety AI_UnequipArmor raczej nie zdejmuje nic poza zbroją. moja propozycja:
- zmienna belt_equiped typu int, w której trzymamy 0 gdy pas nie jest założony lub instance założonego.
- przed założeniem pasa wywołujemy:
func void unequip_belt()
{
  if(belt_equiped) {
var int count;
count = Npc_HasItems(hero, belt_equiped);
Npc_RemoveInvItems(hero, belt_equiped, count);
Npc_CreateInvItems(hero, belt_equiped, count);
  };
};
ale to ma dużą szansę nie działać.
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

Nowy rodzaj artefaktu
#16 2009-08-23, 14:44(Ostatnia zmiana: 2009-08-23, 14:55)
Myślałem że AI_UnequipArmor zdejmuje wszystko co ma mainflag ITEM_KAT_ARMOR. Dlatego poradziłem aby traktować pas nie jako artefakt ale element zbroi. W  mrocznych tajemnicach był pierścień niewidzialności który ściągał na raz zbroję i hełm  i to chyba właśnie tą funkcją.
Już na samym początku tematu proponowałem zmienną pas_equipped.

Dawidek

Dawidek

Użytkownicy
posty29
  • Użytkownicy

Dawidek

Nowy rodzaj artefaktu
#17 2009-08-23, 17:02(Ostatnia zmiana: 2009-08-23, 17:02)
Kiedy wpisuje wear=; nie moge wejść do gry bo wyskakuje błąd.

Twój pomysł z tym żeby potraktować pas jako zbroje był bardzo dobry! Właściwie to chyba nie da się tego zrobić inaczej, więc pozostaje mi poprostu pobawić się tymi modelami. :|
 


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