Przedmioty jako właśność gildii (zastosowanie "ownerguild") 4100 16

O temacie

Autor pawbuj

Zaczęty 9.05.2014 roku

Wyświetleń 4100

Odpowiedzi 16

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
mam problem,który jest dla mnie nielogiczny. mam dla porównania 2 skrypty dot. itemów. przy pierwszym (szynka) gra działa normalnie,a opisany ownerguild zawiera wękoszść znanych mi gildii , a przy kolejnym itemie (smażone mięso) przy próbie wczytania savea/nowej gry i defniowaniu ownerguild na więcej niżeli 2 gildie  mam "access violation" i witaj pulpit.

skrypty itemów poniżej
INSTANCE ItFo_mutton_01 (C_Item)
{
name = "Szynka";

mainflag = ITEM_KAT_FOOD;
flags = ITEM_MULTI;
ownerguild = GIL_GRD;GIL_EBR;GIL_VLK;GIL_STT;GIL_TPL;GIL_NOV;GIL_SFB;GIL_ORG;
value = Value_Schinken;
//
visual = "ItFo_mutton_01.3ds";
scemeName = "FOODHUGE";
on_state[0] = UseMutton1;

description = name;
TEXT[1] = NAME_Bonus_HP; COUNT[1] = HP_Schinken;
TEXT[5] = NAME_Value; COUNT[5] = Value_Schinken;

};

FUNC VOID UseMutton1()
{
Npc_ChangeAttribute (self, ATR_HITPOINTS, HP_Schinken);
};

INSTANCE ItFoMutton (C_Item)
{
name = "Smażone mięso";

mainflag = ITEM_KAT_FOOD;
flags = ITEM_MULTI;
ownerguild = GIL_GRD;GIL_EBR;
value = Value_Fleisch;
// ownerguild = GIL_GRD;GIL_EBR;GIL_VLK;GIL_STT;GIL_TPL;GIL_NOV;GIL_SFB;GIL_ORG;
// ownerguild = GIL_GRD;GIL_EBR;GIL_VLK;GIL_STT;GIL_TPL;GIL_NOV;GIL_SFB;GIL_ORG;
visual = "ItFo_CookedMutton_01.3ds";
scemeName = "MEAT";
on_state[0] = UseMutton;

description = name;
TEXT[1] = NAME_Bonus_HP; COUNT[1] = HP_Fleisch;
TEXT[5] = NAME_Value; COUNT[5] = Value_Fleisch;
};

FUNC VOID UseMutton()
{
Npc_ChangeAttribute (self, ATR_HITPOINTS, HP_Fleisch);
};

 
 

Zucklov

Zucklov

Quest Pack Team
Sztywniutko
posty1220
Propsy1241
ProfesjaSkrypter
  • Quest Pack Team
  • Sztywniutko
Masz 2 identyczne linijki w skrypcie :lol2:
 
Lieb Vaterland magst ruhig sein

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
o to ci chodzi ? jest przecież odznaczone ////   ownerguild          =    GIL_GRD;GIL_EBR;GIL_VLK;GIL_STT;GIL_TPL;GIL_NOV;GIL_SFB;GIL_ORG;
//   ownerguild          =    GIL_GRD;GIL_EBR;GIL_VLK;GIL_STT;GIL_TPL;GIL_NOV;GIL_SFB;GIL_ORG;
 

chicken

chicken

RaveN Studio
posty1230
Propsy559
ProfesjaNierób
  • RaveN Studio
Po 1. Patrz wyżej ( 2 identyczne ), a powinien być tylko 1 ownerGuild i usuń " // "
Po 2. Spróbuj tak:ownerguild          =    GIL_GRD | GIL_EBR | GIL_VLK | GIL_STT | GIL_TPL | GIL_NOV | GIL_SFB | GIL_ORG;

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Po 1. Patrz wyżej ( 2 identyczne ), a powinien być tylko 1 ownerGuild i usuń " // "
Po 2. Spróbuj tak:ownerguild          =    GIL_GRD | GIL_EBR | GIL_VLK | GIL_STT | GIL_TPL | GIL_NOV | GIL_SFB | GIL_ORG;

chicken , jak zwykle ratujesz sytuację, jeżeli jednak nie zadziała pozostaje warunek itemInstance == instance np. szynki etc. i tak większość itemów

Post połączony: 2014-05-09, 09:24
zastanawiam się jeszcze nad jednym , jaka to różnica dla funkcji jeden "&&" , a "&" czy "II" , a "I"?
 

Zucklov

Zucklov

Quest Pack Team
Sztywniutko
posty1220
Propsy1241
ProfesjaSkrypter
  • Quest Pack Team
  • Sztywniutko
To zależy od rodzaju skryptu.
 
Lieb Vaterland magst ruhig sein

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
zastanawiam się jeszcze nad jednym , jaka to różnica dla funkcji jeden "&&" , a "&" czy "II" , a "I"?
&&, || - operatory logiczne
&, | - operatory bitowe

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
zastanawiam się jeszcze nad jednym , jaka to różnica dla funkcji jeden "&&" , a "&" czy "II" , a "I"?
&&, || - operatory logiczne
&, | - operatory bitowe
a bitowe co oznaczają ?
 


pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Nie bardzo rozumiem... Operatory bitowe działają tak samo w C, Javie czy Gothicu. Bit to najmniejsza jednostka danych przyjmująca 0 lub 1. Z jednego lub więcej bitów mamy różne dane jak liczby, napisy. Może poczytaj o reprezentacji binarnej liczb, jeśli nie wiesz, jak liczby są reprezentowane.

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Cytuj
Po 1. Patrz wyżej ( 2 identyczne ), a powinien być tylko 1 ownerGuild i usuń " // "
Po 2. Spróbuj tak
ownerguild          =    GIL_GRD | GIL_EBR | GIL_VLK | GIL_STT | GIL_TPL | GIL_NOV | GIL_SFB | GIL_ORG;
To nie miałoby szans zadziałać, stałe GIL_* to nie maski bitowe, tylko zwykłe kolejne liczby.
To byłoby do odczytania gdyby ich wartości były potęgami dwójki, np 1<<3, 1<<4, 1<<5 itd. A zamiast tego masz w nich po prostu 3, 4, 5 itd. Do tego mechanizm odczytujący to musiałby znaleźć się w silniku, a dla tego pola nie jest on stosowany.

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Cytuj
Po 1. Patrz wyżej ( 2 identyczne ), a powinien być tylko 1 ownerGuild i usuń " // "
Po 2. Spróbuj tak
ownerguild          =    GIL_GRD | GIL_EBR | GIL_VLK | GIL_STT | GIL_TPL | GIL_NOV | GIL_SFB | GIL_ORG;
To nie miałoby szans zadziałać, stałe GIL_* to nie maski bitowe, tylko zwykłe kolejne liczby.
To byłoby do odczytania gdyby ich wartości były potęgami dwójki, np 1<<3, 1<<4, 1<<5 itd. A zamiast tego masz w nich po prostu 3, 4, 5 itd. Do tego mechanizm odczytujący to musiałby znaleźć się w silniku, a dla tego pola nie jest on stosowany.

to co proponujesz?
 

chicken

chicken

RaveN Studio
posty1230
Propsy559
ProfesjaNierób
  • RaveN Studio
Ja proponuje zrobić kilka takich samych przedmiotów po każdej dla gildii, ale najpierw sprawdzić czy działa tamto bo człek może się mylić.
Jak zawsze Avallach dorzuci swoje zdanie z terminologią na poziomie [expert << avallach] i wszystko zepsuje :F.

pawbuj

pawbuj

Użytkownicy
posty1625
Propsy135
ProfesjaSkrypter
  • Użytkownicy
wprawdzie nie wywala do pulpitu , ale i nie działa

najdziwiejsze to jest , że dla itemu "szynki" ciąg gildii jest i nie wywala do pulpitu
 

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Śpieszę z wyjaśnieniami. 
Operatory bitowe są używane zwykle nie z normalnie wklepanymi liczbami dziesiętnymi, ale maskami bitowymi. To także liczby, ale pisane nie ze względu na ich wartość liczbową, ale układ bitów. Najprostsze mają same zera i jedną jedynkę na którejś pozycji. Nie da się bezpośrednio wklepywać zer i jedynek, więc używa się dla osiągnięcia czegoś takiego operatorów przesunięcia bitowego. Biorą one daną liczbę i przesuwają ją w daną stronę o daną ilość bitów, po brakującej stronie dodając zera. Zer z lewej możemy w wyobraźni dopisywać sobie ile chcemy, bo są bez znaczenia. Dajemy ich tyle, żeby długość liczb którymi operujemy się pokrywała.
Przykładowo (w komentarzu zapis bitowy):
const int jeden    = 1     ; // 0001
const int tezjeden = 1 << 0; // 0001 //przesunęliśmy o 0 bitów, czyli dostaliśmy 1 * 2^0 = 1
const int dwa      = 1 << 1; // 0010 //przesunęliśmy o 1 bit, czyli dostaliśmy 1 * 2^1 = 2
const int cztery   = 1 << 2; // 0100 //przesunęliśmy o 2 bity, czyli dostaliśmy 1 * 2^2 = 4
Teraz zobaczmy jak działa operator | (OR) użyty na takich maskach:
const int szesc = dwa | cztery; // 0010 | 0100 = 0110 //w wyniku jedynki są tam, gdzie była jedynka w którymkolwiek z operandów
Jak widać, możemy traktować każdy bit jako "pojemnik" i za pomocą różnych funkcji matematycznych czytać go lub zapisywać. Tak jakby był całą tablicą wartości tak/nie. 
Taki mechanizm nazywany jest polem bitowym. Jest to używane między innymi z flagsami itemów. Dlatego item może mieć zapisane za pomocą | kilka różnych flag w jednej liczbie, a silnik jest w stanie rozczytać które to były flagi. Dlatego też te flagi są definiowane w taki sposób jak pokazałem powyżej i w poprzednim poście: 
CONST INT ITEM_SWD = 1 << 14;
CONST INT ITEM_AXE = 1 << 15;
CONST INT ITEM_BOW = 1 << 19;


Z gildiami jest inaczej. Mają zwykłe kolejne wartości:
CONST INT GIL_EBR = 1;
CONST INT GIL_GRD = 2;
CONST INT GIL_STT = 3;
Kiedy wykonasz na nich operację | (OR), to w odróżnieniu od poprzedniego przykładu, z tego co wyjdzie nie będzie się dało stwierdzić co "weszło":
CONST INT ownerguild = GIL_EBR | GIL_GRD; // 0001 | 0010 = 3

Silnik nie jest w stanie w żaden sposób stwierdzić czy te trzy które wyszło to rezultat dodania do siebie gildii ebr i grd, czy po prostu wklepana gildia stt.
Mogłoby to działać, gdyby gildie także miały przypisane wartości na zasadzie masek bitowych:
CONST INT GIL_EBR = 1 << 0; //0001
CONST INT GIL_GRD = 1 << 1; //0010
CONST INT GIL_STT = 1 << 2; //0100

CONST INT ownerguild = GIL_EBR | GIL_GRD; // 0001 | 0010 = 0011
Tym razem jest to co innego niż gil_stt, silnik jest w stanie bardzo łatwo znowu rozbić to na pojedyncze bity i dowiedzieć się jakie były wartości składowe - tak jak z flagsami itemów. Ale z gildiami nie jest to zaprogramowane, więc zwyczajnie nie możesz tak robić.

chicken

chicken

RaveN Studio
posty1230
Propsy559
ProfesjaNierób
  • RaveN Studio
Wiem, że to ni ma nic wspólnego, ale istnieją również inne operatory bitowe. Łap propsa za wytłumaczenie innym jak to działa.
~ ( NOT )
& ( AND )
| ( OR )
<< ( przesunięcie w lewo )
>> ( przesunięcie w prawo )
^ ( nie wiem :F )
Tłumaczyć nie chce mi się ich zastosowania.
http://guidecpp.cal.pl/cplus,operators-bits


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