Edit:
Ich konnte nun den Fehler finden und ihn beheben.
Ich hatte einen Fehler in der CExchange::CheckSpace() Funktion in der exchange.
Komischerweise ist der Fehler vorher nicht aufgefallen, da ich nur Yang zur Probe gehandelt habe.
Als der Fehler auftrat, konnte ich nur Yang handeln, wenn Spieler B 0 Yang hatte, sobald er >= 1 Yang besitze, stürzte der Core ab.
Das gleiche trat mit den Items auf. Hatte Spieler B kein Item konnte ich handeln, sobald im Inventar ein Gegenstand vorhanden war (auch Equiped),
stürzte der Core ab.
Der Fehler trat das erste mal auf, als ich eine neue Funktion einfügte, wo das Start Equipment direkt angezogen wird beim 1. Login.
Als ich danach handelte, brach der Core zusammen. Durch die Debug Funktion des Cores fand ich dann schließlich den Fehler.
Ich habe nun ewig hin und her probiert und nun funktioniert es und der Fehler ist nicht mehr vorhanden.
Ich hoffe, wenn jemand den Fehler auch hat, dass ich damit weitergeholfen habe. Ich habe 4 Inventarseiten hinzugefügt und das
Tutorial war fehlerhaft. Daran sieht man, dass man Systeme nicht blind einfügen sollte und man sich den Code auch mal anschauen sollte.
Hier war mein Fehler:
in der CheckSpace() :
- else
- {
- int iPos = s_grid1.FindBlank(1, itemSize);
- if (iPos >= 0)
- {
- s_grid1.Put(iPos, 1, itemSize);
- continue;
- }
- else
- {
- iPos = s_grid2.FindBlank(1, itemSize);
- if (iPos >= 0)
- {
- s_grid2.Put(iPos, 1, itemSize);
- continue;
- }
- else
- {
- iPos = s_grid3.FindBlank(1, itemSize);
- if (iPos >= 0)
- {
- s_grid3.Put(iPos, 1, itemSize);
- continue;
- }
- else
- {
- iPos = s_grid4.FindBlank(1, itemSize);
- if (iPos >= 0)
- {
- s_grid4.Put(iPos, 1, itemSize);
- continue;
- }
- return false;
- }
- }
- }
- }
So konnte es nicht funktionieren.
So funktioniert es nun:
- else
- {
- int iPos = s_grid1.FindBlank(1, item->GetSize());
- if (iPos >= 0)
- {
- s_grid1.Put(iPos, 1, item->GetSize());
- }
- else
- {
- iPos = s_grid2.FindBlank(1, item->GetSize());
- if (iPos >= 0)
- {
- s_grid2.Put(iPos, 1, item->GetSize());
- }
- else
- {
- iPos = s_grid3.FindBlank(1, item->GetSize());
- if (iPos >= 0)
- {
- s_grid3.Put(iPos, 1, item->GetSize());
- }
- else
- {
- iPos = s_grid4.FindBlank(1, item->GetSize());
- if (iPos >= 0)
- {
- s_grid4.Put(iPos, 1, item->GetSize());
- }
- else
- {
- return false;
- }
- }
- }
- }
- }
Originaler Thread:
Hey,
wenn ich einen Handel starte und kein Gegenstand hinzufüge, beide Personen annehmen drücken, klappt der Handel.
Wird jedoch ein Gegenstand oder Yang dem Handel hinzugefügt, crasht das Game sobald die 2. Person annehmen drückt.
Ich habe folgenden Fehler:
#0 0x0812bc3d in CExchange::CheckSpace (this=0x3c7dd480) at item.h:58
58 BYTE GetSize() { return m_pProt o ? m_pProto->bSize : 0; }
[New Thread 28805500 (LWP 100140/game)]
[New Thread 28805200 (LWP 100136/game)]
[New Thread 28804f00 (LWP 100135/game)]
[New Thread 28804300 (LWP 100160/game)]
(gdb) bt full
#0 0x0812bc3d in CExchange::CheckSpace (this=0x3c7dd480) at item.h:58
victim = 0x542b3800
item = 0xbfbfa084
i = <value optimized out>
bDSInitialized = <value optimized out>
s_grid1 = {m_iWidth = 5, m_iHeight = 18, m_pGrid = 0x3cbda400 ""}
s_grid2 = {m_iWidth = 5, m_iHeight = 18, m_pGrid = 0x3cbda460 ""}
s_vDSGrid = {<std::_Vector_base<short unsigned int,std::allocator<short unsigned int> >> = {
_M_impl = {<std::allocator<short unsigned int>> = {<__gnu_cxx::new_allocator <short unsigned int>> = {<No data fields>}, <No data fields>}, _M_start = 0x0,
_M_finish = 0x0, _M_end_of_storage = 0x0}}, <No data fields>}
#1 0x0812c829 in CExchange::Accept (this=0x3c7dd480, bAccept=true)
at exchange.cpp:663
iItemCount = 0
victim = 0x542b3800
__FUNCTION__ = "Accept"
#2 0x08163547 in CInputMain::Analyze (this=0x3cbea09c, d=0x3cbea000,
bHeader=<value optimized out>,
c_pData=0x290e6000 "\033\004\033\005 S\033\005\002") at input_main.cpp:3648
ch = 0x542b7000
iExtraLen = <value optimized out>
__FUNCTION__ = "Analyze"
Ich habe schon in der Exchange.cpp die CheckSpace() nach Fehlern durchsucht aber nichts gefunden.