Skocz do zawartości

Błąd z skillami na P po rozpoczęciu gry | Brak efektu DMG podczas bicia potworów/metinów/bossów

Opublikowano

Cześć.

Staram się nie pisać takich tematów póki sam nie spróbuje znaleźć rozwiązania. Ale tutaj nie mogę znaleźć.


Pierwszy błąd ( skille) :

Spoiler

Pierwszy problem to błąd z skillami na p.

Dodałem gui do wyboru klas postaci, nie jest ono doskonałe, w przyszłości pewnie się zmieni, aktualnie wygląda tak:

obraz.png.0955de765eabf827ef6a434d177e08f1.png

 

Quest jaki wprowadziłem wygląda tak:

Spoiler

quest skillchoose begin
    state start begin
        when login or levelup with pc.get_level() >= 5 and pc.get_skill_group() == 0 begin
            pc.open_skillchoose()
        end

        when login or levelup with pc.level >= 5 begin
            local job = pc.get_job()
            local group = pc.get_skill_group()
            if job == 0 then -- Wojownik
                if group == 1 then -- Body
                    pc.set_skill_level(1, 40)
                    pc.set_skill_level(2, 40)
                    pc.set_skill_level(3, 40)
                    pc.set_skill_level(4, 40)
                    pc.set_skill_level(5, 40)
                    pc.set_skill_level(6, 40)
                elseif group == 2 then -- Mental
                    pc.set_skill_level(16, 40)
                    pc.set_skill_level(17, 40)
                    pc.set_skill_level(18, 40)
                    pc.set_skill_level(19, 40)
                    pc.set_skill_level(20, 40)
                    pc.set_skill_level(21, 40)
                end
            elseif job == 1 then -- Ninja
                if group == 1 then -- Dagger
                    pc.set_skill_level(31, 40)
                    pc.set_skill_level(32, 40)
                    pc.set_skill_level(33, 40)
                    pc.set_skill_level(34, 40)
                    pc.set_skill_level(35, 40)
                    pc.set_skill_level(36, 40)
                elseif group == 2 then -- Archer
                    pc.set_skill_level(46, 40)
                    pc.set_skill_level(47, 40)
                    pc.set_skill_level(48, 40)
                    pc.set_skill_level(49, 40)
                    pc.set_skill_level(50, 40)
                    pc.set_skill_level(51, 40)
                end
            elseif job == 2 then -- Szaman
                if group == 1 then -- Smok
                    pc.set_skill_level(91, 40)
                    pc.set_skill_level(92, 40)
                    pc.set_skill_level(93, 40)
                    pc.set_skill_level(94, 40)
                    pc.set_skill_level(95, 40)
                    pc.set_skill_level(96, 40)
                elseif group == 2 then -- Healer
                    pc.set_skill_level(106, 40)
                    pc.set_skill_level(107, 40)
                    pc.set_skill_level(108, 40)
                    pc.set_skill_level(109, 40)
                    pc.set_skill_level(110, 40)
                    pc.set_skill_level(111, 40)
                end
            elseif job == 3 then -- Sura
                if group == 1 then -- BM
                    pc.set_skill_level(76, 40)
                    pc.set_skill_level(77, 40)
                    pc.set_skill_level(78, 40)
                    pc.set_skill_level(79, 40)
                    pc.set_skill_level(80, 40)
                    pc.set_skill_level(81, 40)
                elseif group == 2 then -- WP
                    pc.set_skill_level(61, 40)
                    pc.set_skill_level(62, 40)
                    pc.set_skill_level(63, 40)
                    pc.set_skill_level(64, 40)
                    pc.set_skill_level(65, 40)
                    pc.set_skill_level(66, 40)
                end
            end
        end
    end
end

 

Doszliśmy do etapu gdzie pojawia się problem.

Po wyborze profesji skille odpowiednie dla danej profesji poprawnie przypisują się do postaci.

Lecz w momencie, gdy ta postać to sura albo szaman nadaje nam klasę postaci, lecz nie rozwiniętą do poziomu P.

obraz.png.c6d015484b68be97ee192c8303e2f738.png

W przypadku ninji oraz wojownika wszystko działa bez zastrzeżeń (skille nadają się na poziomie P)

 

Szukałem w kodzie z nadzieją, że znajdę jakieś błąd, znalazłem funkcję odpowiedzialną za nadawanie skilli. Wygląda ona tak:

 

Spoiler

    int pc_set_skill_level(lua_State* L)
    {
        DWORD dwVnum = (DWORD)lua_tonumber(L, 1);
        BYTE byLev = (BYTE)lua_tonumber(L, 2);

        LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
        ch->SetSkillLevel(dwVnum, byLev);

        ch->SkillLevelPacket();

        return 0;
    }

 

Ale nie widze w niej problemu. Ktoś jakieś pomysły?

 

Drugi błąd, brak efektu dmg:


 

Spoiler

Z drugim błędem spotkałem się dzisiaj. Problem wynika z braku efektu damage zadawanemu potworowi/metinowi/bossowi.

Z tego co @Sevence podpowiedział problem jest powiązany z tym tematem:

W tym przypadku znalazłem w kodzie binki funkcje w InstanceBaseEffect odpowiedzialną za efekty ataków.

Wygląda ona tak:
 

Spoiler
bool CInstanceBase::ProcessDamage()
{
	if (m_DamageQueue.empty())
	{
		return false;
	}

	SEffectDamage sDamage = m_DamageQueue.front();

	m_DamageQueue.pop();

	DWORD damage = sDamage.damage;
	BYTE flag = sDamage.flag;
	BOOL bSelf = sDamage.bSelf;
	BOOL bTarget = sDamage.bTarget;

	CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera();	
	float cameraAngle = GetDegreeFromPosition2(pCamera->GetTarget().x,pCamera->GetTarget().y,pCamera->GetEye().x,pCamera->GetEye().y);

	DWORD FONT_WIDTH = 30;
	
	CEffectManager& rkEftMgr=CEffectManager::Instance();

	D3DXVECTOR3 v3Pos = m_GraphicThingInstance.GetPosition();
	v3Pos.z += float(m_GraphicThingInstance.GetHeight());

	D3DXVECTOR3 v3Rot = D3DXVECTOR3(0.0f, 0.0f, cameraAngle);

	if ( (flag & DAMAGE_DODGE) || (flag & DAMAGE_BLOCK) )
	{
		if(bSelf)
			rkEftMgr.CreateEffect(ms_adwCRCAffectEffect[EFFECT_DAMAGE_MISS],v3Pos,v3Rot);
		else
			rkEftMgr.CreateEffect(ms_adwCRCAffectEffect[EFFECT_DAMAGE_TARGETMISS],v3Pos,v3Rot);
		//__AttachEffect(EFFECT_DAMAGE_MISS);
		return true;
	}
	else if (flag & DAMAGE_CRITICAL)
	{
		//rkEftMgr.CreateEffect(ms_adwCRCAffectEffect[EFFECT_DAMAGE_CRITICAL],v3Pos,v3Rot);
		//return; ĽýŔÚµµ ÇĄ˝Ă.
	}

	std::string strDamageType;
	DWORD rdwCRCEft = 0;
	/*
	if ( (flag & DAMAGE_POISON) )
	{
		strDamageType = "poison_";
		rdwCRCEft = EFFECT_DAMAGE_POISON;
	}
	else
	*/
	{
		if(bSelf)
		{
			strDamageType = "damage_";
			if(m_bDamageEffectType==0)
				rdwCRCEft = EFFECT_DAMAGE_SELFDAMAGE;
			else
				rdwCRCEft = EFFECT_DAMAGE_SELFDAMAGE2;
			m_bDamageEffectType = !m_bDamageEffectType;
		}
		else if (bTarget == false)
		{
			strDamageType = "nontarget_";
			rdwCRCEft = EFFECT_DAMAGE_NOT_TARGET;
			return true;//ÇöŔç Ŕűżë ľČµĘ.
		}
		else
		{
			strDamageType = "target_";
			rdwCRCEft = EFFECT_DAMAGE_TARGET;
		}
	}
	
	DWORD index = 0;
	DWORD num = 0;
	std::vector<std::string> textures;
	while(damage>0)
	{
		if (index > 7)
		{
			TraceError("ProcessDamageą«ÇŃ·çÇÁ °ˇ´ÉĽş");
			return false;
		}
		return true;
		num = damage%10;
		damage /= 10;
		char numBuf[MAX_PATH];
		sprintf(numBuf,"%d.dds",num);
		textures.push_back("d:/ymir work/effect/affect/damagevalue/"+strDamageType+numBuf);
		
		rkEftMgr.SetEffectTextures(ms_adwCRCAffectEffect[rdwCRCEft],textures);
		
		D3DXMATRIX matrix,matTrans;
		D3DXMatrixIdentity(&matrix);
		matrix._41 = v3Pos.x;
		matrix._42 = v3Pos.y;
		matrix._43 = v3Pos.z;
		D3DXMatrixTranslation(&matrix,v3Pos.x,v3Pos.y,v3Pos.z);
		D3DXMatrixMultiply(&matrix,&pCamera->GetInverseViewMatrix(),&matrix);
		D3DXMatrixTranslation(&matTrans,FONT_WIDTH*index,0,0);
		matTrans._41 = -matTrans._41;
		matrix = matTrans*matrix;
		D3DXMatrixMultiply(&matrix,&pCamera->GetViewMatrix(),&matrix);
		
		rkEftMgr.CreateEffect(ms_adwCRCAffectEffect[rdwCRCEft],D3DXVECTOR3(matrix._41,matrix._42,matrix._43)
			,v3Rot);	
		
		textures.clear();

		index++;
	}	
}

 

W tym momencie podesłałem funkcję której nie dotykałem w żadnym stopniu. Po wprowadzeniu przezemnie zmian wystąpiła poprawa, ale nadal nie jest to efekt idealny.

Przed:

72452bdae59460d7fa9df1576fb51e34.gif.a08b514ec6e140fd21da9d638efbbe5c.gif

Po mojej zmianie:
0e04d3977ea879319f53a0d7394cd01e.gif.65e7ef45e632105c92a40461bd3b8fd2.gif

Gdzie widocznie widać że damage zadawany różni się widocznie od efektu wyświetlanego.

 

Edytowane przez atk

Rozwiązane przez atk

Przejdź do rozwiązania

Featured Replies

Opublikowano

W jaki sposób jest realizowany wybór grupy umiejętności? Z tego co widać w queście jest tylko wywołanie okienka wyboru, ciężko coś stwierdzić bez kodu. 

 

Drugi błąd jest spowodowany wdrożeniem tej poprawki:

 

Zapomniałem zaktualizować temat, zobacz funkcję AddDamageEffect. 

Opublikowano
  • Autor

Hmm, spojrzałem na tą funkcję. Dodałem kilka linijek wywoływania logów aby zobaczyć czy funkcja jest wywoływana poprawnie.

 

oto ona:

void CInstanceBase::AddDamageEffect(std::uint32_t damage, std::uint8_t flag, bool bSelf, bool bTarget)
{
	Tracef("AddDamageEffect called with damage: %u, flag: %u, bSelf: %d, bTarget: %d\n", damage, flag, bSelf, bTarget);

	if (CPythonSystem::Instance().IsShowDamage())
	{
		SEffectDamage sDamage;
		sDamage.bSelf = bSelf;
		sDamage.bTarget = bTarget;
		sDamage.damage = damage;
		sDamage.flag = flag;

		Tracef("Adding damage effect to queue\n");
		m_DamageQueue.push(sDamage);
	}
	else
	{
		Tracef("Damage effects are turned off\n");
	}
}

 

Z tego co widzę po logach to funkcja AddDamageEffect działa poprawnie i dodaje efekty do kolejki tej m_DamageQueue.

Video (dwa hity) :

6649796a13d64546c4d3cadc9be95d69.gif.f18b0566b479d77fb8083ea5394c98d3.gif

Logi:

1220 20:11:21092 :: AddDamageEffect called with damage: 526, flag: 1, bSelf: 0, bTarget: 1
1220 20:11:21092 :: Adding damage effect to queue
1220 20:11:21933 :: AddDamageEffect called with damage: 1053, flag: 33, bSelf: 0, bTarget: 1
1220 20:11:21933 :: Adding damage effect to queue
Opublikowano

Zmień typ danych na DWORD i BYTE. 

Opublikowano
  • Autor

Zmieniłem, problem ten sam.

void CInstanceBase::AddDamageEffect(DWORD damage, BYTE flag, bool bSelf, bool bTarget)
{
	if (CPythonSystem::Instance().IsShowDamage())
	{
		SEffectDamage sDamage;
		sDamage.bSelf = bSelf;
		sDamage.bTarget = bTarget;
		sDamage.damage = damage;
		sDamage.flag = flag;
		m_DamageQueue.push(sDamage);
	}
}

 

	public:
		void AddDamageEffect(DWORD damage, BYTE flag, bool bSelf, bool bTarget);

 

Na chwile usunąłem zmiany jakie wprowadziłem w temacie który podlinkowałeś, po usunięciu działało, znów wprowadziłem zmiany, zmieniłem typ danych w funkcji powyżej i problem powrócił. A więc w czym leży problem?

Gdzieś w funkcji processdamage ale ja go nie widze teraz, za głupi jestem 🥲

Opublikowano

Możesz opublikować funkcje w których wprowadzałeś zmiany?

Opublikowano
  • Autor

Problem z dmg rozwiązany o jednego returna za du żo dodałem w funkcji ProcessDamage 🫣 Dziękuje jak zawsze @Sevence

a417cdca291b474c2cf522b3252ff65a.gif.b5d0154902b8f8672d0927d06890debd.gif

 

 

 

Opublikowano

Nie ma za co, a co do wyboru umiejętności to jak pisałem bez kodu nie jestem wstanie pomóc. w tym queście nie ma błędu. 

Udało się rozwiązać problem z wyborem umiejętności okazało się że system ma błąd.

Opublikowano
  • Autor
  • Rozwiązanie
16 godzin temu, atk napisał(a):

Problem z dmg rozwiązany o jednego returna za du żo dodałem w funkcji ProcessDamage 🫣 Dziękuje jak zawsze @Sevence

a417cdca291b474c2cf522b3252ff65a.gif.b5d0154902b8f8672d0927d06890debd.gif

 

 

 

 

16 godzin temu, Sevence napisał(a):

Nie ma za co, a co do wyboru umiejętności to jak pisałem bez kodu nie jestem wstanie pomóc. w tym queście nie ma błędu. 

Udało się rozwiązać problem z wyborem umiejętności okazało się że system ma błąd.

 

  • Sevence zablokował(a) ten temat
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.