Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Pokaż wątki - Siemekk

Strony: 1 [2] 3 4 ... 8
21
Skrypty / Wywołanie funkcji po trafieniu zaklęciem
« dnia: 2017-08-29, 15:16 »
Tak jak w temacie. Jakoś nigdy nie zastanawiałem się jak to zrobić. Próbowałem B_AssesMagic, ale funkcja nie wiem czemu nie odpala się wcale (pytanie nr 1 - dlaczego?), próbowałem Hookować, ale gdy atakujący schowa broń funkcja się nie wywoła... Więc pytanie - jak wywołać funkcję gdy np. firebolt trafi w npc?

22
Sprzęt, oprogramowanie / Problem z nowym monitorem
« dnia: 2017-08-21, 14:28 »
Siemka. Niedawno kupiłem sobie drugi monitor BenQ GL2250HM aby mieć dwa podłączone do jednego PC. Problem jest taki, że ten nowy monitor ma pewną wadę której nie mogę za nic naprawić - obraz wyświetlany na monitorze jest żółtawy podczas gdy ten na drugim (kupionym wcześniej) jest biały. Bardziej odpowiada mi obraz z pierwszego monitora - ten biały, ale ten nowy za nic nie może się dopasować kolorami. Ustawiałem ręcznie w menu monitora, przeinstalowałem sterowniki karty graficznej, zamieniałem je miejscami (kablami), ale dalej obraz jest żółtawy. Czy ktoś wie o co może chodzić? Czy niestety monitor musi lecieć na gwarancję?
Jakby potrzebna była moja karta graficzna to: MSI Radeon 270x 2GB Gaming OC.

23
Narzędzia / Proste tworzenie nauczycieli
« dnia: 2017-07-16, 20:54 »
Teachers Maker
Platforma gry: Gothic 2 (Wkrótce Gothic 1)
Wymagany jest NetFramework 4.5
Na potrzeby modyfikacji: Złote Wrota 2 Królestwo Elei
Twórca programu: Siemekk
Wersja programu: 1.1
Testerzy:
Carelion
Fabiosek

Opis:
Jako, iż napisałem nowy system nauki, gdzie możemy podać trochę więcej argumentów takich jak np.:(maksymalna ilość punktów którą nauczyciel może nas nauczyć, bądź mnożnik ceny jaką zażyczy) postanowiłem napisać swój pierwszy program, który w łatwy sposób tworzyłby dialog dla nauczyciela. Program ma dwie możliwości zapisu - Do pliku bądź jako plik. Podczas zapisu do pliku należy podać plik, jak wyskoczy, że nastąpi zastąpienie pliku kliknij zapisz, a program dopisze skrypt do pliku. Do właściwego działania programu potrzebny jest ten skrypt:
/*
Funkcje odpowiedzialne za:
Naukę i budowanie tekstu!
Budowane są przez Teachers Maker.exe
// -------------------------------------------------------------------------------------;
Teach_GetLearnCost i TeachHitchance_GetCost w tej funkcji ustala się progi punktowe.
// -------------------------------------------------------------------------------------;
*/

const string Currency_Name = "szt. złota";
//Jeżeli nie masz LeGo odkomentuj tą funkcję
//func int RGBA(var int a, var int b, var int c, var int d)
//{
// return 0;
//};

func void PutMsg(var string msg, var int color, var int duration)
{
PrintScreen (msg, -1, -1, "font_old_20_white.tga", 3);
};


func void Teach_AivarHandle  (var C_NPC oth,var int attrib,var int points)
{
if(attrib == ATR_STRENGTH)
{
oth.aivar[REAL_STRENGTH] = oth.aivar[REAL_STRENGTH] + points;
}
else if(attrib == ATR_DEXTERITY)
{
oth.aivar[REAL_DEXTERITY] = oth.aivar[REAL_DEXTERITY] + points;
}
else if(attrib == ATR_MANA_MAX)
{
oth.aivar[REAL_MANA_MAX] = oth.aivar[REAL_MANA_MAX] + points;
};
};

func int Teach_GetLearnCost  (var C_NPC oth,var int attribut)
{
var int kosten;
kosten = 0;
if(attribut == ATR_STRENGTH)
{
if(oth.aivar[REAL_STRENGTH] >= 200)
{
kosten = 5;
}
else if(oth.aivar[REAL_STRENGTH] >= 150)
{
kosten = 4;
}
else if(oth.aivar[REAL_STRENGTH] >= 100)
{
kosten = 3;
}
else if(oth.aivar[REAL_STRENGTH] >= 50)
{
kosten = 2;
}
else
{
kosten = 1;
};
};
if(attribut == ATR_DEXTERITY)
{
if(oth.aivar[REAL_DEXTERITY] >= 200)
{
kosten = 5;
}
else if(oth.aivar[REAL_DEXTERITY] >= 150)
{
kosten = 4;
}
else if(oth.aivar[REAL_DEXTERITY] >= 100)
{
kosten = 3;
}
else if(oth.aivar[REAL_DEXTERITY] >= 50)
{
kosten = 2;
}
else
{
kosten = 1;
};
};
if(attribut == ATR_MANA_MAX)
{
if(oth.aivar[REAL_MANA_MAX] >= 300)
{
kosten = 5;
}
else if(oth.aivar[REAL_MANA_MAX] >= 200)
{
kosten = 4;
}
else if(oth.aivar[REAL_MANA_MAX] >= 120)
{
kosten = 3;
}
else if(oth.aivar[REAL_MANA_MAX] >= 60)
{
kosten = 2;
}
else
{
kosten = 1;
};
};

return kosten;
};

func void Teach_Raise (var C_NPC oth,var int attrib,var int points)
{
var string msg;
if(attrib == ATR_STRENGTH)
{
oth.attribute[ATR_STRENGTH] = oth.attribute[ATR_STRENGTH] + points;
msg=ConcatStrings("Siła + ",IntToString(points));
msg=ConcatStrings(msg, " = ");
msg=ConcatStrings(msg, IntToString(oth.attribute[ATR_STRENGTH]));
PutMsg(msg, RGBA(255,255,100,255), 6);
};
if(attrib == ATR_DEXTERITY)
{
oth.attribute[ATR_DEXTERITY] = oth.attribute[ATR_DEXTERITY] + points;
msg=ConcatStrings("Zręczność + ",IntToString(points));
msg=ConcatStrings(msg, " = ");
msg=ConcatStrings(msg, IntToString(oth.attribute[ATR_DEXTERITY]));
PutMsg(msg, RGBA(100,255,100,255), 6);
};
if(attrib == ATR_MANA_MAX)
{
oth.attribute[ATR_MANA_MAX] = oth.attribute[ATR_MANA_MAX] + points;
msg=ConcatStrings("Maks. Mana + ",IntToString(points));
msg=ConcatStrings(msg, " = ");
msg=ConcatStrings(msg, IntToString(oth.attribute[ATR_MANA_MAX]));
PutMsg(msg, RGBA(100,100,255,255), 6);
};
if(attrib == ATR_HITPOINTS_MAX)
{
oth.attribute[ATR_HITPOINTS_MAX] = oth.attribute[ATR_HITPOINTS_MAX] + points;
msg=ConcatStrings("Punkty trafień + ",IntToString(points));
msg=ConcatStrings(msg, " = ");
msg=ConcatStrings(msg, IntToString(oth.attribute[ATR_HITPOINTS_MAX]));
PutMsg(msg, RGBA(100,100,255,255), 6);
};
Teach_AivarHandle(oth,attrib,points);
};

func void B_TeachAttribute (var C_NPC slf, var C_NPC oth, var int attrib, var int points, var int teacherMAX, var int Gold_Multipler)
{
var string msg;

var int kosten; kosten = (Teach_GetLearnCost (oth, attrib) * points);

if (attrib!=ATR_STRENGTH) && (attrib!=ATR_DEXTERITY) && (attrib!=ATR_MANA_MAX)
{
Print ("*** Błąd: Zły parametr ***");
return;
};

// ------ Lernen NICHT über teacherMax ------
var int realAttribute;
if (attrib == ATR_STRENGTH) { realAttribute = oth.attribute[ATR_STRENGTH]; }
else if (attrib == ATR_DEXTERITY) { realAttribute = oth.attribute[ATR_DEXTERITY]; }
else if (attrib == ATR_MANA_MAX) { realAttribute = oth.attribute[ATR_MANA_MAX]; };

if (realAttribute >= teacherMAX)
{
msg = ConcatStrings ("Maksimum tego nauczyciela wynosi ", IntToString(teacherMAX));
PutMsg(msg, RGBA(180,0,0,255), 6);
B_Say (slf, oth, "$NOLEARNYOUREBETTER");
return;
};

if ((realAttribute + points) > teacherMAX)
{
msg = ConcatStrings ("Maksimum tego nauczyciela wynosi ", IntToString(teacherMAX));
PutMsg(msg, RGBA(180,0,0,255), 6);
B_Say (slf, oth, "$NOLEARNOVERPERSONALMAX");
return;
};

if (oth.lp < kosten)
{
B_Say (slf, oth, "$NOLEARNNOPOINTS");
PutMsg("Za mało Punktów Nauki!",RGBA(180,0,0,255), 6);
return;
};

var int Need_Gold; Need_Gold = kosten * Gold_Multipler;
if(Npc_HasItems(oth,itmi_gold)< Need_Gold)
{
B_Say (slf, oth, "$SHITNOGOLD");
PutMsg("Nie masz wystarczającej ilości pieniędzy!",RGBA(180,0,0,255), 6);
return;
};


oth.lp = oth.lp - kosten;
B_GiveInvItems(oth,slf, itmi_gold, Need_Gold);
Npc_RemoveInvItems(slf,itmi_gold,Need_Gold);
Teach_Raise (oth, attrib, points);
return;
};

func string B_BuildAttribute (var int attrib, var int points, var int multipler)
{
var int kosten; kosten = (Teach_GetLearnCost(hero,attrib) * points);
var string att;
if (attrib == ATR_STRENGTH) { att = "Siła + "; }
else if (attrib == ATR_DEXTERITY) { att = "Zręczność + "; }
else if (attrib == ATR_MANA_MAX || attrib == ATR_MANA) { att = "Maks. Mana + "; };

var string msg; msg = ConcatStrings(att, IntToString(points));

msg = ConcatStrings(msg," (Koszt: ");
msg = ConcatStrings(msg, IntToString(kosten));
msg = ConcatStrings(msg," Punktów Nauki, ");
msg = ConcatStrings(msg,IntToString(kosten* multipler));
msg = ConcatStrings(msg,Currency_Name);
msg = ConcatStrings(msg,")");

return msg;
};

func void TeachHitHance_Aivar(var C_NPC oth,var int attrib,var int points)
{
if(attrib == 1)
{
oth.aivar[REAL_TALENT_1H] = oth.aivar[REAL_TALENT_1H] + points;
}
else if(attrib == 2)
{
oth.aivar[REAL_TALENT_2H] = oth.aivar[REAL_TALENT_2H] + points;
}
else if(attrib == 3)
{
oth.aivar[REAL_TALENT_BOW] = oth.aivar[REAL_TALENT_BOW] + points;
}
else if(attrib == 4)
{
oth.aivar[REAL_TALENT_CROSSBOW] = oth.aivar[REAL_TALENT_CROSSBOW] + points;
};
};

func int TeachHitchance_GetCost(var C_NPC oth,var int attribut)
{
var int kosten;
kosten = 0;
if(attribut == 1)
{
if(oth.aivar[REAL_TALENT_1H] >= 90)
{
kosten = 4;
}
else if(oth.aivar[REAL_TALENT_1H] >= 60)
{
kosten = 3;
}
else if(oth.aivar[REAL_TALENT_1H] >= 30)
{
kosten = 2;
}
else
{
kosten = 1;
};
};
if(attribut == 2)
{
if(oth.aivar[REAL_TALENT_2H] >= 90)
{
kosten = 4;
}
else if(oth.aivar[REAL_TALENT_2H] >= 60)
{
kosten = 3;
}
else if(oth.aivar[REAL_TALENT_2H] >= 30)
{
kosten = 2;
}
else
{
kosten = 1;
};
};
if(attribut == 3)
{
if(oth.aivar[REAL_TALENT_BOW] >= 90)
{
kosten = 4;
}
else if(oth.aivar[REAL_TALENT_BOW] >= 60)
{
kosten = 3;
}
else if(oth.aivar[REAL_TALENT_BOW] >= 30)
{
kosten = 2;
}
else
{
kosten = 1;
};
};

if(attribut == 4)
{
if(oth.aivar[REAL_TALENT_CROSSBOW] >= 90)
{
kosten = 4;
}
else if(oth.aivar[REAL_TALENT_CROSSBOW] >= 60)
{
kosten = 3;
}
else if(oth.aivar[REAL_TALENT_CROSSBOW] >= 30)
{
kosten = 2;
}
else
{
kosten = 1;
};
};

return kosten;
};

func void Raise_Hitchance(var C_NPC oth,var int attrib,var int points)
{
var string msg;
if(attrib == 1)
{
oth.hitchance[1] = oth.hitchance[1] + points;
msg=ConcatStrings("Broń jednoręczna + ",IntToString(points));
msg=ConcatStrings(msg, " = ");
msg=ConcatStrings(msg, IntToString(oth.hitchance[1]));
PutMsg(msg,RGBA(255,255,100,255), 6);
};
if(attrib == 2)
{
oth.hitchance[2] = oth.hitchance[2] + points;
msg=ConcatStrings("Broń dwuręczna + ",IntToString(points));
msg=ConcatStrings(msg, " = ");
msg=ConcatStrings(msg, IntToString(oth.hitchance[2]));
PutMsg(msg,RGBA(100,255,100,255), 6);
};
if(attrib == 3)
{
oth.hitchance[3] = oth.hitchance[3] + points;
msg=ConcatStrings("Łuk + ",IntToString(points));
msg=ConcatStrings(msg, " = ");
msg=ConcatStrings(msg, IntToString(oth.hitchance[3]));
PutMsg(msg,RGBA(100,100,255,255), 6);
};

if(attrib == 4)
{
oth.hitchance[4] = oth.hitchance[4] + points;
msg=ConcatStrings("Kusza + ",IntToString(points));
msg=ConcatStrings(msg, " = ");
msg=ConcatStrings(msg, IntToString(oth.hitchance[4]));
PutMsg(msg,RGBA(100,100,255,255), 6);
};

TeachHitHance_Aivar(oth,attrib,points);
};

func void B_TeachHitchance(var C_NPC slf, var C_NPC oth, var int attrib, var int points, var int teacherMAX, var int Gold_Multipler)
{
var string msg;

var int kosten; kosten = (TeachHitchance_GetCost (oth, attrib) * points);

if (attrib!=1) && (attrib!=2) && (attrib!=3) && (attrib!=4)
{
Print ("*** Błąd: Zły parametr ***");
return;
};

// ------ Lernen NICHT über teacherMax ------
var int realAttribute;
if (attrib == 1) { realAttribute = oth.hitchance[1]; }
else if (attrib == 2) { realAttribute = oth.hitchance[2]; }
else if (attrib == 3) { realAttribute = oth.hitchance[3]; }
else if (attrib == 4) { realAttribute = oth.hitchance[4]; };

if (realAttribute >= teacherMAX)
{
msg = ConcatStrings ("Maksimum tego nauczyciela wynosi ", IntToString(teacherMAX));
PutMsg(msg,RGBA(180,0,0,255), 6);
B_Say (slf, oth, "$NOLEARNYOUREBETTER");
return;
};

if ((realAttribute + points) > teacherMAX)
{
msg = ConcatStrings ("Maksimum tego nauczyciela wynosi ", IntToString(teacherMAX));
PutMsg(msg,RGBA(180,0,0,255), 6);
B_Say (slf, oth, "$NOLEARNOVERPERSONALMAX");
return;
};

if (oth.lp < kosten)
{
B_Say (slf, oth, "$NOLEARNNOPOINTS");
PutMsg("Za mało Punktów Nauki!",RGBA(180,0,0,255), 6);
return;
};

var int Need_Gold; Need_Gold = kosten * Gold_Multipler;
if(Npc_HasItems(oth,itmi_gold)< Need_Gold)
{
B_Say (slf, oth, "$SHITNOGOLD");
PutMsg("Nie masz wystarczającej ilości pieniędzy!",RGBA(180,0,0,255), 6);
return;
};


oth.lp = oth.lp - kosten;
B_GiveInvItems(oth,slf, itmi_gold, Need_Gold);
Npc_RemoveInvItems(slf,itmi_gold,Need_Gold);
Raise_Hitchance (oth, attrib, points);
return;
};

func string B_BuildHitchance(var int attrib, var int points, var int multipler)
{
var int kosten; kosten = (TeachHitchance_GetCost(hero,attrib) * points);
var string att;
if (attrib   == 1) { att = "Broń jednoręczna + "; }
else if (attrib == 2) { att = "Broń dwuręczna + "; }
else if (attrib == 3) { att = "Łuk + "; }
else if (attrib == 4) { att = "Kusza + "; };

var string msg; msg = ConcatStrings(att,IntToString(points));

        msg = ConcatStrings(msg,"%");
msg = ConcatStrings(msg," (Koszt: ");
msg = ConcatStrings(msg, IntToString(kosten));
msg = ConcatStrings(msg," Punktów Nauki, ");
msg = ConcatStrings(msg,IntToString(kosten* multipler));
msg = ConcatStrings(msg, Currency_Name);
msg = ConcatStrings(msg,")");

return msg;
};
Należy parsować to po Story\G_Functions\. Jeżeli użyjesz tego w swoim modzie, warto by było poinformować o tym w napisach końcowych.
Screen z okna programu. Nie wiem po co :F
Spoiler


24
Skrypty / AST Poradniki
« dnia: 2017-06-20, 21:32 »
Wymagana jest znajomość obiektowego C++
Poradniki
#1 CInvoke - Hook
Zacznijmy od podstaw - czym jest hook? Otóż Hook jest to doczepienie się do funkcji silnika. Pytanie po co? Dajmy przykład:
Mam funkcję sprawdzającą czy hero ma wyciągniętą broń dystansową. Podczas tego chciałbym mieć printa. Teraz mam dwa wyjścia:
A)Napisać szereg warunków i wywołać funkcję co klatkę
B)Zrobić Hook'a dzięki czemu oszczędzę sobie zbędnych warunków.
Wersja A:
Spoiler

Wersja B:
Spoiler

Chyba widać, że Hook jest krótszy. Teraz trzeba opisać co każdy element oznacza:
Zacznijmy od pustej funkcji:
int __fastcall _BowMode(oCAIHuman*, void*, int);
Pierwszy int wziął się stąd, że oryginalna funkcja BowMode zawraca Int'a.
0x00695F00 protected: int __thiscall oCAIHuman::BowMode(int)
__fastcall - Funkcja musi zostać wywołana szybciej niż oryginalna, więc rejestry idą w ruch.
_BowMode - Nazwa funkcji. Chyba nie trzeba wyjaśniać.
oCAIHuman* - Jest to klasa z której pochodzi metoda. W Ikarusie uznawana jako zmienna ECX.
void* - Zawsze po zastosowaniu __fastcall, o ile hookowana funkcja miała typ __thiscall, po klasie jest "virtual table" oznaczany zmienną void* nie jest wykorzystany, ale MUSI BYĆ!
int - Argument z oryginalnej funkcji - w Ikarusie był odczytywany za pomocą MEM_ReadInt(ESP + ...);
Przeanalizuj, i spróbuj zrozumieć co się dzieje - do skutku!

Wykonałeś punkt o myśleniu? Nie? To analizuj, bo nic nie zrozumiesz...
Teraz opiszę Hook'a. Do dzieła.
CInvoke<int(__thiscall*)(oCAIHuman*, int)> pBowMode(0x00695F00, _BowMode, IVK_AUTO);

CInvoke - Szablon stworzony wewnątrz AST, służy do Hookowania.
int - zawsze na początku CInvokemusimy podać co oryginalna funkcja zawraca. Tutaj zawracała Int'a, lecz jeżeli zawracała by void dalibyśmy void, jeżeli zawracałaby zCView*, dalibyśmy zCView* etc.
__thiscall* - funkcja była typu __thiscall, czyli musimy tu umieścić __thiscall*.
oCAIHuman* - Funkcja była metodą klasy, więc musimy podać wskaźnik do ów klasy.
int - Jej argumentem był tylko int, jeżeli miałaby więcej argumentów podawalibyśmy je w kolejności po przecinku. Co ciekawe - w CInvoke nigdy, nie podajemy void*, co ma sens, ponieważ tylko w __fastcall, musi być void* po klasie i to tylko pod warunkiem, że hookowana funkcja była typu __thiscall - jeżeli to wiedziałeś to dobrze zapamiętałeś pierwszy punkt o "Pustej funkcji"
pBowMode - Oryginalna funkcja, która posiada przed argumentami dodatkowy jeden argument którą jest klasa - w tym wypadku tym argumentem będzie oCAIHuman*.
0x00695F00 - adres do oryginalnej funkcji możemy go dostać na kilka sposobów.
Sposób 1: Używając IDA szukamy adresu.
Sposób 2: Tabela z WoG'a - niestety nie mam linku.
Sposób 3: W AST 003 mamy plik G2_Names - są tam wszystkie adresy z gry.
_BowMode - wskaźnik do funkcji w której będą przechowane informacje o Hooku. Tak samo jak w Ikarusie HookEngine(adres, Len, funkcja);
IVK_AUTO - Polecam używać tego, gdyż niektóre funkcje były użyte w AST.dll - po prostu zapobiega błędom.

Trzeci punkt to rozbudowa funkcji _BowMode. Jednak to już zostawiam wam. Możecie robić tam co chcecie. Dodam tylko od siebie - jeżeli nie damy w roboczej funkcji pBowMode(_this, arg);Oryginalna funkcja nie wywoła się nigdy i nie będzie działać tak jak należy. Jeżeli w tym przykładzie zabrałbym pBowMode(_this, arg); to bohater nie mógłby strzelać z łuku, chować broni długodystansowej etc.
Tak więc spróbujcie zrobić kilka przykładów dla utrwalenia. Więcej przykładów pojawi się wkrótce - piszę to szybko, ponieważ boję się o utratę prądu :F

Pozdrawiam Siemekk :D

25
Skrypty / 60 FPS i przyśpieszenie
« dnia: 2017-06-20, 12:51 »
Tak więc mam pewien problem. Otóż mam funkcję która jest wywołana 60 razy na sekundę. Teraz chciałbym obliczyć prędkość potrzebną do przemieszczenia się view'a  z punktu A (np. 300) do punktu B(6000). Używam tego wzoru:
v = s/t gdzie, jednak nie wiem, jak skalibrować czas aby móc go podawać w milisekundach. Tak więc moje pytanie - jak zrobić, aby po podaniu czasu np. 3 funkcja zawróciła wynik w taki sposób, że ten view przemieści się w ciągu 3 sekund na podaną pozycję. Zapewne prosta matematyka, ale ten no wakacje się zaczynają :F

26
Sprzęt, oprogramowanie / Dysk SSD
« dnia: 2017-06-14, 18:24 »
Planuję zakup SSD pod system. Chciałbym kupić ADATA SU800 128GB. Jednak przed zakupem chciałbym się zapytać, czy warto. Czy w cenie do 300 PLN mogę znaleźć coś lepszego.

27
C, C++ / BASS Library - Decoding Channel
« dnia: 2017-05-20, 21:01 »
Mam taki mały problem - otóż używam biblioteki BASS, problem pojawia się gdy chcę przerwać odtwarzanie starego dźwięku i zagrać nowy plik mp3.
Init_Bass();

string sound = Music_GetFolder(file);
BASS_StreamFree(current);
current = BASS_StreamCreateFile(false, sound.c_str(), 0, 0, BASS_SAMPLE_LOOP);
BASS_ChannelSetPosition(current, 10000, BASS_POS_DECODETO);

cout << BASS_ErrorGetCode() << endl;

BASS_ChannelPlay(current,  false);
Przy odpaleniu muzyki za pierwszym razem dźwięk się pojawia. Lecz gdy dany utwór ma zostać zmieniony na inny to muzyka jest przerywana,  lecz nowy utwór muzyczny nie jest grany. W dodatku w konsoli widnieje liczba 37 co oznacza błąd:
BASS_ERROR_NOTAVAIL Only decoding channels (BASS_STREAM_DECODE) are allowed when using the "no sound" device. The BASS_STREAM_AUTOFREE flag is also unavailable to decoding channels.
Moje pytanie jest następujące - skoro kanał jest dekodujący, to jak mam sprawić by owym nie był? W necie poszukałem i znalazłem użycie funkcji BASS_ChannelSetPosition, lecz nie wiem jak się z tym obsłużyć. Domyślam się, że gdzieś to jest na internecie, ale ja jestem zbyt głupi by to znaleźć :F Byłbym wdzięczny za pomoc :)

28
C, C++ / Sprawdzanie pliku w folderze
« dnia: 2017-05-13, 15:31 »
Cześć. Czym najlepiej sprawdzać czy dany plik znajduje się w folderze? Używałem fstream, ale gdy stworzyłem bibliotekę to nigdy nie znajduje pliku w folderze (Nawet gdy jest w tym samym folderze co biblioteka). Kod wygląda tak:
bool SoundFound(string file_name)
{
string cs = "../_work/data/Music/" +  file_name;
fstream file;
file.open(cs.c_str());

if(file.good())
return true;
else
return false;
}
Byłbym wdzięczny za wskazanie jakiegoś lepszego sposobu na szukanie plików.

29
Skrypty / Klasa CCamSys
« dnia: 2017-05-06, 11:29 »
Cześć. Mam takie pytanie - czy jest może gdzieś rozpisane co robi dana zmienna w ów klasie? Chciałbym wiedzieć która zmienna odpowiada za przybliżenie kamery. Byłbym bardzo wdzięczny za pomoc.
Klasa:
CLASS CCamSys
{
// angles -180 to 180
VAR FLOAT bestRange;
VAR FLOAT minRange;
VAR FLOAT maxRange;
VAR FLOAT bestElevation;
VAR FLOAT minElevation;
VAR FLOAT maxElevation;
VAR FLOAT bestAzimuth;
VAR FLOAT minAzimuth;
VAR FLOAT maxAzimuth;
VAR FLOAT bestRotZ;
VAR FLOAT minRotZ;
VAR FLOAT maxRotZ;
VAR FLOAT rotOffsetX;
VAR FLOAT rotOffsetY;
VAR FLOAT rotOffsetZ;
VAR FLOAT targetOffsetX;
VAR FLOAT targetOffsetY;
VAR FLOAT targetOffsetZ;

// dynamic
VAR FLOAT veloTrans;   // velocity while easing   to best position
VAR FLOAT veloRot;   // velocity while rotating to best orientation

VAR INT   translate;     // rotate around target, 1: on, 0:off
VAR INT   rotate;     // rotate around target, 1: on, 0:off
VAR INT   collision; // disable collision for this mode (ideal pos must be near player)
};

30
Skrypty / Krzaki w dialogach
« dnia: 2017-04-20, 19:45 »
Tak więc mam taki problem. Jednak zmiana kodowania nic nie daje! Mam sobie plik dialogowy Henry'ego. Ale zawsze gdy go naprawię, lub wrzucę do innego pliku (Po zmianie kodowania) to po wyłączeniu i włączeniu pliku nie posiada on już żadnego kodowania! Co jest grane? Jest tak tylko w przypadku Henry'ego...

31
HTML i CSS / Pobieranie linków z playlisty
« dnia: 2017-04-12, 21:15 »
Chciałbym stworzyć coś takiego, że na swojej stronie podaje link do playlisty z YT i dzięki temu niżej zostają wypisane wszystkie linki do utworów. Czy takie coś jest możliwe do zrealizowania, oraz co by było potrzebne do takiej strony.

32
Spacer / Szybkie przemieszczanie się do vobów
« dnia: 2017-03-30, 18:28 »
Tak jak w temacie czy jest to jakoś możliwe? Chciałbym pozmieniać większość przedmiotów ze świata, ale nie wiem czy jest coś takiego w spacerze (Coś jak "goto vob ITMW_1H_MIL_SWORD" - Przykład)

33
Skrypty / Szukanie VFX w świecie
« dnia: 2017-03-24, 19:41 »
Znalazłem bardzo fajny adres dotyczący VFX. Jednak nie wiem jak szukać VFX w świecie :/ Klasa oCVisualFX jest pochodną zCVob, ale gdy używam MEM_SearchVobByName lub Hookuje tworzenie VFX to (1) Nie znajduje go, mimo iż teoretycznie jest, 2) Crashuje :I ) Więc pytanie brzmi gdzie są zapisane dane o zCVisualFX wywołanych przez Wld_PlayEffect?

34
Skrypty / Zmiana pozycji kości
« dnia: 2017-03-17, 22:16 »
Tak jak w temacie :F Mam dostęp do klasy zCModelNodeInst* i chciałbym zmienić pozycję / rotację danej  kości. Jak można to zrobić? Domyślam się, że wystarczy Trafo, ale czy tylko? Czy muszę pobierać pozycję, i ją zmieniać czy wystarczy, że wpiszę liczbę? (Gdy wpisałem z góry liczbę, to pozycja była ta sama)
Chodzi mi o coś takiego jak to:
https://www.youtube.com/watch?v=dHCRioHBVnk


Dodam też, że edycja w programie 3d z góry odpada!

35
Skrypty / Problem z twarzami
« dnia: 2017-03-11, 19:54 »
Tak więc mam problem z mordkami. Dodałem 16 nowych twarz dla NPC. Nazwałem je właściwie, dodałem stałe do pliku AI_Constants.d
const int FACE_N_SEKCIARZ = 164;
const int FACE_N_GorNaRan = 165;
const int FACE_N_GorNaDrak = 166;
const int FACE_N_Hanis = 167;
const int FACE_N_GorNaToth = 168;
const int FACE_N_GorNaKosh = 169;
const int FACE_N_Talas = 170;
const int FACE_N_Dusty = 171;
const int FACE_N_Caine = 172;
const int FACE_N_Ghorim = 173;
const int FACE_N_Novice1 = 174;
const int FACE_N_Novice2 = 175;
const int FACE_N_Harlok = 176;
const int FACE_N_Shrat = 177;
const int FACE_N_Novice3 = 178;
const int FACE_N_Viran = 179;
const int FACE_N_Darrion = 180;
Jednak jak odpalam grę to wszyscy NPC którzy powinni mieć te mordy ich nie mają... Wszyscy biegają z Facem Harada.... Ktoś wie o co chodzi?
Nazwa tekstury + Visual postaci:
HUM_HEAD_V179_C0.tga  - Face
B_SetNpcVisual(self,MALE,"Hum_Head_Bald",FACE_N_VIRAN,BodyTex_N,itar_kdw_h); a tu funkcja ustawienia Visuala.
Byłbym wdzięczny za pomoc w pewnie banalnej sprawie.

36
Historia teamu
Dawno dawno temu... czyli półtora roku temu swoją karierę modderską zaczynał pewien użytkownik jego nick to był SiemaczyS. Nie wiedział on wtedy nic o moddingu potrafił używać tylko gotowców, ale też nie zawsze. W listopadzie 2015r. dołączył do grupy "RiquerTeam" która po czasie się rozpadła a on sam postanowił powołać nową o nazwie "Czas Honoru Team". Po czterech miesiącach pracy modyfikacja nie rozwijała się dalej z powodu, że twórca nie miał jeszcze takiej wiedzy, aby tworzyć "cuda" dlatego postanowił zacząć się uczyć. Dzięki użytkownikom tego forum @Splash, @Bogdan Zwei oraz nieudzielający się @carelion zdołał się szczątkowo czegoś nauczyć i w kwietniu 2016r. wydał małą modyfikację o nazwie UnBalance MOD. Była to jego 5 modyfikacja, ale pierwsza opublikowana na TheModders.
(dla ciekawskich poprzednie to:"Czas Honoru - Prolog" oraz "Saturas The Game 2-4") Kod prologu zaginął, więc nie został on ukończony w 100% a na internecie może gdzieś jest jego stara wersja. UnBalance to była pierwsza modyfikacja tak długo rozwijana bo doczekała sie fhuj fixów a jej obecna wersja 1.4.1 jest już prawie grywalna, ale niektórzy narzekają bo nie przestrzegają zasad  :lol2: Jako iż bardzo miły użytkownik o nicku @Młody ścierwojad opublikował niedawno polską wersje lhv w wersji 0.9.9 to postanowiłem przepisywać UnBalance od 0. Stwierdziłem, że nie ma to sensu gdyż mogę połączyć stary koncept ze światem LHV oraz bajerami z UnBalance. I z tego właśnie powodu pokazuję wam prezentację najnowszej mojej modyfikacji o nazwie "Czas Honoru".

Status produkcji: 18%
Długość rozgrywki: Oryginalny czas G2 + ok. 10h
Data premiery: Planowana Czerwiec 2017r.
Ilość nowych zadań: +-50
Ważne!!!
Modyfikacja uznaje fabułę modyfikacji do G2 jakimi były "Mroczne Tajemnice" oraz "Czas Zapłaty".
Opis fabuły
Standard Xardas przywołuje Bohatera z gruzowisk Świątyni Śniącego. Opowiada mu o smokach. Mówi także o magach wody i ich poszukiwaniach. Wspomina też o trzech nowych wątkach jednak nie tak od razu. Mówi bezimiennemu, że nie chce aby wyruszył od razu na przygodę dot. nowych wątków. Opowie nam o tym dopiero gdy zyskamy jakieś lepsze wyposażenie (Powrót z Khorinis) Gdy bezimienny wraca Xardas opowiada mu o trzech rzeczach które musi zdobyć, aby wyruszyć do polowania na smoki.
I.Boska moc
Na początku opowiada mu o pięciu boskich artefaktach ukrytych gdzieś w Khorinis. "Chaos" - Łuk niszczyciel który potrafi przebić troll'a z odległości 100 kroków. "Tarcza Honoru" - Jedyna tarcza wojownika gdy umrze nadzieja. Potrafi rozbić strzałę na drobny pył gdy ta w nią trafi. "Kostur Równowagi" święty zaginiony kostur Adanosa, każdy mag który posiądzie jego moc będzie mógł zatrzymać wrogie pociski magiczne. "Korona Adanosa"  - Wiadomo tylko to, że potrafi ochronić właściciela przed atakiem zamrażając przeciwnika na kość. Oraz ostatni artefakt o którym nic się nie zapisało więc będziemy musieli poszukać sami.
II.Miecz run
Później opowiada nam o historii pirata który zabił swojego mistrza po to tylko, aby Śniący musiał odejść. Pirat ten posiadał miecz zwany "Ostrzem boskiej trójcy". Tak potężny oręż nie mógł przepaść więc wiadomo czego Xardas od niego chce. Chodzi mu o miecz runiczny który będziemy musieli dla niego odzyskać. Ale to oznacza jedno... Świątynia Śniącego. Jednak o powrocie do niej dowiecie się w trakcie gry!

III. Pradawna moc
Ostatnim o czym nam opowiada to olbrzymie zaburzenia magiczne w pobliżu jego starego domostwa. Każe nam je zbadać, ale do tylko i wyłącznie wtedy, gdy rozwiążemy sprawy z górami na północnym-wschodzie. O tym co tam spotkamy nie mogę powiedzieć bo będzie to lekki spoiler.

Postacie
W grze będziemy mogli spotkać naszych starych znajomych z MT oraz G1. Krótki opis trzech z nich.
Kazmir:
Uznajemy, że obserwował on upadek bariery z chatki alchemika. Wydostał się on więc bezproblemowo z GD zaraz po upadku magicznego pola. Ruda która mu została ukrył, a gdy spotyka naszego bohatera chce, aby mu pomógł ją odzyskać. Czy to zrobi zależy już od naszej woli.
Aidan:
Wraz z innymi z obozu rebeliantów założył mały obóz myśliwych który zaopatrza miasto w skóry i inne trofea. Z jego pomocą możemy się wyuczyć kowalskiego fachu oraz tego jak "zadowalać" cieniostwory  :lol2:.
Kharim:Po wygnaniu z obozu rebeliantów dołączył do starego obozu. Jednak po upadku bariery gdy on został obezwładniony piorunem nikt mu nie pomógł, znalazła się dusza która mu pomogła nazywała się Lee. Po tym wydarzeniu przyłączył się on spowrotem do Lee gdzie od tej pory pełni on rolę organizatora walk na arenie. Poprzysiągł on zemstę na jednym z ludzi ze starego obozu, ale to wyjaśni on nam dopiero z czasem...

Cała modyfikacja skupia się na oddaniu klimatu prawdopodobnego który mógł się wydarzyć po wydarzeniach w  Mrocznych Tajemnicach i Czasie Zapłaty, poza tym będzie ona wprowadzała kilka zmian względem orginalnych rzeczy w grze(zastosowanie Ikarusa)
Zmiany i innowacje
W modyfikacji doświadczymy wiele zmian np. w systemie pogody oto mała lista zmian które powstają na potrzeby modyfikacji:
-Zaawansowany system pogodowy(Podział na dni słoneczne, mgliste, pochmurne. Losowe deszcze oraz ich podział na mżawki, deszcze oraz burze. Zmiana zasięgu widzenia podczas deszczu pod warunkiem, że bohater jest na dworze - zależy od wylosowanego typu deszczu)
-Walka runicznym ostrzem(Możemy zmieniać w nim runy tak samo jak w "Czasie Zapłaty")
-Zaawansowane kowalstwo
-Nowy system wyświetlania informacji
-Menu statystyk a'la Gothic 3
-Walka dwoma mieczami i tarczą
-Wolne celowanie
-Obrażenia obszarowe
-System snu + Koszmary senne
-Nowy system teleportatcji
-Nowy system muzyczny + nowe Soundtracki

Tak jak mówiłem, to tylko kilka zmian a będzie ich naprawdę sporo. Kolor zielony oznacza, że coś jest ukończone w +90%, kolor pomarańczowy oznacza, że coś jest w fazie produkcji czyli +- 40%, kolor czerwony zaś oznacza, że prace zostały dopiero zaczęte.
Screeny
Nie ma tego dużo, lecz trzeba pokazać, że prace trwają.
Spoiler














Wykorzystane zasoby z modyfikacji:
[/size]

-Czas Zapłaty
-Returning 2.0
-UnBalance 1.4 :lol2:
-Mroczne Tajemnice
-Dark Saga
-Złote Wrota

Info dla chętnych do pomocy. Wiadomo, że nie dam rady sam zrobić takiej modyfikacji w przeciągu 3 miesięcy, więc liczę na lekką pomoc :) Nie musisz znać Ikarusa na blachę wystarczą mi osoby które będą robiły w Spacerze (vobowanie), oraz osoby które będą pisały dialogi i skrypty przedmiotów + NPC. Nie jest to wiedza którą posiadają tylko wybrańcy, więc jeżeli czujesz, że coś potrafisz to napisz mi na PW może się nadasz :)
Pozdrawiam i zachęcam do komentowania.

37
C, C++ / [C++]Łączenie bibliotek
« dnia: 2017-03-07, 18:41 »
Cześć. Chciałbym napisać własną bibliotekę do odtwarzania muzyki, którą wgrałbym do G2. Jako podstawę tej biblioteki chcę użyć BASS.dll. Jednak nie jestem, aż taki dobry w C++ aby to napisać więc chciałbym się zgłosić po jedną poradę.
Otóż jak sprawdzać czy muzyka znajduje się w folderze nie podanym z góry... coś w tym stylu:
D:\Siemekk\BIN\SiemekkLib.dll
a biblioteka ma sprawdzać czy plik znajduje się tutaj:
D:\Siemekk\BIN\WorkSpace\Music\*

Bardzo bym prosił o odpowiedź i pomoc.
Pozdrawiam.

Udało mi się z tym uporać, lecz teraz mam problem z inicjacją BASS'u do swojej biblioteki... robię wszystko tak jak w poradnikach dodaje plik .lib includuje BASS.h a przy kompilacji mam taki błąd:

Już nie wiem co robić... wszystkie fora przeszukałem, ale to nic nie pomaga. Nic nie pisze na temat dodawania bibliotek do swojej biblioteki...

P.S sorry za 3x zmianę nazwy tematu.

38
Skrypty / Muzyka z Menu
« dnia: 2017-03-05, 18:41 »
Cześć. Mam takie proste pytanie. Czy jest jakiś sposób, aby po startupie gry muzyka z menu się wyłączyła? Nie dość, że gra ona za głośno to przeszkadza mi np. w pierwszym dialogu... Byłbym wdzięczny za odpowiedź :P

39
Skrypty / [Gothic II] Tworzenie ścieżek
« dnia: 2017-03-01, 21:40 »
Od dłuższego czasu chciałem napisać coś fajnego, czyli sroki, wrony, bociany i wszystkie inne ptaszyska które latają po niebie. Pomysł już mam mianowicie musiałbym podczas inicjacji gry tworzyć w na niebie voby lub coś podobnego aby ptaki mogły tam dolecieć (Anim8). I tutaj mam pytanie... Czy dało by się zrobić coś takiego jak "ścieżka" na niebie, która by ustalała teoretyczny ruch ptaka? Chodzi o to, że drób nie ma lecieć sztywno z punku A do punktu B A ---Ptak---> B, tylko leciałby na przykład lekko w górę i potem opadał. 

40
Skrypty / zVEC3 proste funkcje
« dnia: 2017-02-28, 19:07 »
Jako, że potrzebowałem funkcji pracujących na VEC3 postanowiłem takowe napisać. Skrypt jest na chwilę obecną w "podstawowej" wersji i operuje tylko podstawowymi działaniami matematycznymi (Dodawanie, odejmowanie, mnożenie i dzielenie). Skrypty mogą być używane z funkcjami silnika które zawracają zVEC3, pod warunkiem że zawracać będą one wartość przez MEM_InstToPtr.
Kod źródłowy wektorów, parsować gdzieś po LeGo.
func int VEC3_Create(var int x, var int y, var int z)
{
var int varray[3];
varray[0] = mkf(x);
varray[1] = mkf(y);
varray[2] = mkf(z);

return _@(varray);
};

func void VEC3_SetX(var int ptr,var int x)
{
MEM_WriteInt(ptr,x);
};

func void VEC3_SetY(var int ptr,var int y)
{
MEM_WriteInt(ptr+4,y);
};

func void VEC3_SetZ(var int ptr,var int z)
{
MEM_WriteInt(ptr+8,z);
};

func void VEC3_Adds(var int fvec, var int svec)
{
var int x1; x1 = MEM_ReadInt(fvec);
var int y1; y1 = MEM_ReadInt(fvec + 4);
var int z1; z1 = MEM_ReadInt(fvec + 8);

var int x2; x2 = MEM_ReadInt(svec);
var int y2; y2 = MEM_ReadInt(svec + 4);
var int z2; z2 = MEM_ReadInt(svec + 8);

MEM_WriteInt(fvec, addf(x1,x2));
MEM_WriteInt(fvec+4, addf(y1,y2));
MEM_WriteInt(fvec+8, addf(z1,z2));
};

func void VEC3_Subs(var int fvec, var int svec)
{
var int x1; x1 = MEM_ReadInt(fvec);
var int y1; y1 = MEM_ReadInt(fvec + 4);
var int z1; z1 = MEM_ReadInt(fvec + 8);

var int x2; x2 = MEM_ReadInt(svec);
var int y2; y2 = MEM_ReadInt(svec + 4);
var int z2; z2 = MEM_ReadInt(svec + 8);

MEM_WriteInt(fvec, subf(x1,x2));
MEM_WriteInt(fvec+4, subf(y1,y2));
MEM_WriteInt(fvec+8, subf(z1,z2));
};

func void VEC3_Mult(var int fvec,var int svec)
{
var int x1; x1 = MEM_ReadInt(fvec);
var int y1; y1 = MEM_ReadInt(fvec + 4);
var int z1; z1 = MEM_ReadInt(fvec + 8);

var int x2; x2 = MEM_ReadInt(svec);
var int y2; y2 = MEM_ReadInt(svec + 4);
var int z2; z2 = MEM_ReadInt(svec + 8);

MEM_WriteInt(fvec, mulf(x1,x2));
MEM_WriteInt(fvec+4, mulf(y1,y2));
MEM_WriteInt(fvec+8, mulf(z1,z2));
};

func void VEC3_Divs(var int fvec, var int svec)
{
var int x1; x1 = MEM_ReadInt(fvec);
var int y1; y1 = MEM_ReadInt(fvec + 4);
var int z1; z1 = MEM_ReadInt(fvec + 8);

var int x2; x2 = MEM_ReadInt(svec);
var int y2; y2 = MEM_ReadInt(svec + 4);
var int z2; z2 = MEM_ReadInt(svec + 8);

MEM_WriteInt(fvec, divf(x1,x2));
MEM_WriteInt(fvec+4, divf(y1,y2));
MEM_WriteInt(fvec+8, divf(z1,z2));

};

func int VEC3_GetX(var int vptr)
{
return MEM_ReadInt(vptr);
};

func int VEC3_GetY(var int vptr)
{
return MEM_ReadInt(vptr+4);
};

func int VEC3_GetZ(var int vptr)
{
return MEM_ReadInt(vptr+8);
};

Wiem, że sporo brakuje, dlatego prosiłbym o podesłanie co jeszcze dodać (jakie funkcje).
Opis funkcji
int VEC3_Create(int x, int y, int z); //-Utwórz wektor 3D Nic dodać nic ująć. Wektor zapisujemy do zmiennej typu int. Przykład.
var int vec; vec = VEC3_Create(100,100,100);
/******************************************************************************************************/
void VEC3_SetX(int vec, int x); //Ustalamy ręcznie X naszego wektora. Zmienna vec to wskaźnik z naszego wektora (z VEC3_Create) a x to pozycja X
void VEC3_SetY(int vec, int y); //Tak jak wyżej z wyjątkiem, że podajemy Y
void VEC3_SetZ(int vec, int z); //Tak jak wyżej z wyjątkiem, że podajemy Z
/******************************************************************************************************/
void VEC3_Adds(int fvec, int svec); //Dodaj Wektory do siebie. Funkcja sumuje ze sobą dwa wektory argumenty to pierwszy wektor i drugi wektor dla przykładu
var int a; a = VEC3_Create(100,100,100); //Utwórz 1 wektor
var int b; b = VEC3_Create(25,25,25); //Utwórz 2 wektor
VEC3_Adds(a,b); //Teraz wektor A nie będzie miał wartości 100,100,100 tylko 125,125,125. Kolejne funkcje działają na tej samej zasadzie, różni się tylko działania.  Tak więc mamy:
/******************************************************************************************************/
void VEC3_Subs(int fvec, int svec); //Odejmij wektory od siebie
void VEC3_Mult(int fvec, int svec); //Pomnóż wektory przez siebie
void VEC3_Divs(int fvec, int svec); //Podziej wektory przez siebie (fvec : svec)
/******************************************************************************************************/
Ostatnie (Na obecną chwilę) funkcje, zawracają nam wartość x,y lub z naszego wektora. Tak więc mamy:
int VEC3_GetX(int vec); //Zawróci nam X, naszego wektora
int VEC3_GetY(int vec); //Zawróci nam Y, naszego wektora
int VEC3_GetZ(int vec); //Zawróci nam Z, naszego wektora

I to na obecną chwilę wszystko. Zachęcam do wypróbowania i zgłaszania błędów i propozycji. (Daje to do tutoriali, bo kiedyś może się to przydać, zwłaszcza gdy będzie to gotowe w 100%)

Wymagany jest Ikarus i pakiet Floats.

Pozdrawiam.

Strony: 1 [2] 3 4 ... 8
Do góry