Exemple #1
0
CPlayerBall::~CPlayerBall()
{
	if (GetHoldingPlayer())
		RemoveFromPlayerHands(GetHoldingPlayer());

	if (GetCreator())
		GetCreator()->SetPlayerBall(NULL);
}
void IEffectPainter::WriteToStream (IWriteStream *pStream)
	{
	CString sUNID = GetCreator()->GetUNIDString();
	sUNID.WriteToStream(pStream);

	CString sClass = GetCreator()->GetTag();
	sClass.WriteToStream(pStream);

	OnWriteToStream(pStream);
	}
	void GUICommentItem::Draw(const math::rectf*vp)
	{
		if (!IsVisible())
			return;
		video::IVideoDevice *dev = Engine::getInstance().getDevice();

		GUI::IGUIManager* creator = GetCreator();

		const math::rectf& rect = GetDefaultRegion()->GetRect();
		const math::rectf& clip = GetDefaultRegion()->GetClippedRect();

		math::rectf bgR(rect);

		video::TextureUnit tex1;

		IFont* font = gFontResourceManager.getFontByName("Default");
		if (!font)
			font = gFontResourceManager.getDefaultFont();

		math::rectf oldScissor = GetCreator()->GetDevice()->getScissorRect();
		dev->setScissorRect(clip);
		tex1.SetTexture(gTextureResourceManager.loadTexture2D("CommentBG.png"));
		dev->useTexture(0, &tex1);
		dev->draw2DImage(bgR, 1);

		if (font && m_Comment)
		{
			math::rectf tmpRc;

			tex1.SetTexture(gTextureResourceManager.loadTexture2D("twitter.png"));
			tmpRc.ULPoint= bgR.ULPoint+20;
			tmpRc.BRPoint = tmpRc.ULPoint + 30;
			dev->useTexture(0, &tex1);
			dev->draw2DImage(tmpRc, 1);
			tmpRc.ULPoint = tmpRc.BRPoint;
			tmpRc.BRPoint = bgR.BRPoint - 60;

			m_fontAttrs.fontAligment = GUI::EFA_TopLeft;
			m_fontAttrs.fontColor.Set(1, 1, 1, 1);
			m_fontAttrs.hasShadow = false;
			m_fontAttrs.spacing = 0;
			m_fontAttrs.lineSpacing = 10;
			m_fontAttrs.wrap = true;
			m_fontAttrs.fontSize = 18;
			font->print(tmpRc, &m_fontAttrs, &clip, m_Comment->text, creator->GetRenderQueue());

		}
		GetCreator()->GetRenderQueue()->Flush();


		dev->setScissorRect(oldScissor);
		IGUIElement::Draw(vp);
	}
Exemple #4
0
void CPlayerBall::SetVel(Vector vel, float spinCoeff, int spinFlags, body_part_t bodyPart, bool markOffsidePlayers, float shotTakerMinDelay, bool resetShotCharging)
{
	CBall::SetVel(vel, spinCoeff, spinFlags, bodyPart, markOffsidePlayers, shotTakerMinDelay, resetShotCharging);

	if (!m_bIsBallCannonMode && m_pPl == GetCreator())
		SaveBallCannonSettings();
}
Exemple #5
0
void CWaypoints::WriteGPX(const std::wstring& wstrFilename)
{
	try
	{
		CGPXFileWriter GpxWriter(wstrFilename, GetCreator());
		for (std::list<CPoint>::iterator it = m_Points.begin(); it != m_Points.end(); ++it)
		{
			GpxWriter.AddNextWaypoint(it->m_dLatitude, it->m_dLongitude);
			// Caution: field order is important, see http://www.topografix.com/GPX/1/1/
			GpxWriter.CurrentWpt()->addAltitude(it->m_iAltitude);
			GpxWriter.CurrentWpt()->addName(it->m_wstrName);

			// <extensions> after all standard fields:
			GpxWriter.CurrentWpt()->addRadiusEx(it->m_iRadius);
			for(std::vector<CStringProp>::iterator iter = it->m_OSMPropList.begin();
				iter != it->m_OSMPropList.end();
				iter++)
			{
				GpxWriter.CurrentWpt()->addOSMTag(iter->Name(), iter->Value());
			}
		}
	}
	catch (CGPXFileWriter::Error e)
	{
		MessageBox(NULL, e.c_str(), L("GPX write error"), MB_ICONEXCLAMATION);
	}
}
Exemple #6
0
void Pet::UpdateArmor()
{
    float value = 0.0f;
    float bonus_armor = 0.0f;
    UnitMods unitMod = UNIT_MOD_ARMOR;

    Unit *owner = GetOwner();
    // chained, use original owner instead
    if (owner && owner->GetTypeId() == TYPEID_UNIT && ((Creature*)owner)->GetEntry() == GetEntry())
        if (Unit *creator = GetCreator())
            owner = creator;

    // hunter and warlock and shaman pets gain 35% of owner's armor value
    if (owner && (getPetType() == HUNTER_PET || (getPetType() == SUMMON_PET 
        && (owner->getClass() == CLASS_WARLOCK || owner->getClass() == CLASS_SHAMAN))))
        bonus_armor = 0.35f * float(owner->GetArmor());

    value  = GetModifierValue(unitMod, BASE_VALUE);
    value *= GetModifierValue(unitMod, BASE_PCT);
    value += GetStat(STAT_AGILITY);
    value += GetModifierValue(unitMod, TOTAL_VALUE) + bonus_armor;
    value *= GetModifierValue(unitMod, TOTAL_PCT);

    SetArmor(int32(value));
}
bool GUIWebPageOrganizer::OnEvent(Event*e)
{
	bool res=IGUIPanelElement::OnEvent(e);
	if(e->getType()==ET_Keyboard)
	{
		KeyboardEvent* evt=(KeyboardEvent*)e;

		if(evt->Char=='`')
		{
			_SwitchFullscreen();
		}
	}
	if(res)
	{
		for(int i=0;i<m_pages.size();++i)
		{
			if(GetCreator()->GetFocusElement()==m_pages[i])
			{
				m_activePage=i;
				toFront(m_pages[i]);


				break;
			}
		}
	}
	return res;
}
bool GUICheckBox::_HandleKeyboardEvent(KeyboardEvent*e)
{
	IGUIManager* creator=GetCreator();
	if(!creator->HasFocus(this))
		return false;
	return m_component->OnKeyboardEvent(e);
}
Exemple #9
0
bool Pet::UpdateStats(Stats stat)
{
    if (stat > STAT_SPIRIT)
        return false;

    // value = ((base_value * base_pct) + total_value) * total_pct
    float value  = GetTotalStatValue(stat);

    Unit* owner = GetOwner();

    // chained, use original owner instead
    if (owner && owner->GetTypeId() == TYPEID_UNIT && ((Creature*)owner)->GetEntry() == GetEntry())
    {
        if (Unit* creator = GetCreator())
            owner = creator;
    }

    if (stat == STAT_STAMINA)
    {
        if(owner && owner->GetTypeId() == TYPEID_PLAYER  && owner->getClass() == CLASS_WARLOCK)
            value += float(owner->GetStat(stat)) * 0.75f;
        else if (owner)
            value += float(owner->GetStat(stat)) * 0.3f;
    }
    // warlock's and mage's pets gain 30% of owner's intellect
    else if (stat == STAT_INTELLECT && getPetType() == SUMMON_PET)
    {
        if (owner && (owner->getClass() == CLASS_WARLOCK || owner->getClass() == CLASS_MAGE))
            value += float(owner->GetStat(stat)) * 0.3f;
    }
    // deathknight's ghoul gain 100% of owner's strength
    else if (stat == STAT_STRENGTH && getPetType() == SUMMON_PET)
    {
        if (owner && (owner->getClass() == CLASS_DEATH_KNIGHT))
        {
            value += float(owner->GetStat(stat)) * 1.0f;
        }
    }

    SetStat(stat, int32(value));

    switch (stat)
    {
        case STAT_STRENGTH:         UpdateAttackPowerAndDamage();        break;
        case STAT_AGILITY:          UpdateArmor();                       break;
        case STAT_STAMINA:          UpdateMaxHealth();                   break;
        case STAT_INTELLECT:        UpdateMaxPower(POWER_MANA);          break;
        case STAT_SPIRIT:
        default:
            break;
    }

    return true;
}
Exemple #10
0
void Projectile::Collide(PhysicalObject *pOtherObject)
{
	switch (pOtherObject->GetPhysicalObjectType())
	{

	case PhysicalObject::ePROJECTILE:  //don't collide with other projectiles originating from the same creator
		if (((Projectile *)pOtherObject)->GetCreator() != GetCreator())
		{
			//ApplyOnePhysicalDamage(((Projectile *)pOtherObject)->GetCreator());
			ApplyOnePhysicalDamage(0);
		}
		break;

	default:
		if (GetCreator() != pOtherObject)
		{
			//ApplyOnePhysicalDamage(pOtherObject);
			ApplyOnePhysicalDamage(0);
		}
		break;

	}
}
void CResource::SerializeToXmlFile(const nstring &file)
{
    xmlTextWriterPtr writer = NULL;

    /* Create a new XmlWriter for uri, with no compression. */
    if((writer = xmlNewTextWriterFilename(file.c_str(), 0)) == NULL)
		NOVA_EXP("CResource::SerializeToXmlFile: Error creating the xml writer", BAD_OPERATION);

	// automatic indentation for readability
	xmlTextWriterSetIndent(writer, 1);

	if(xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL) < 0)
		NOVA_EXP("CResource::SerializeToXmlFile: xmlTextWriterStartDocument fail", BAD_OPERATION);

	if(xmlTextWriterStartElement(writer, BAD_CAST "NovaResource") < 0)
		NOVA_EXP("CResource::SerializeToXmlFile: xmlTextWriterStartElement fail", BAD_OPERATION);

    if(xmlTextWriterWriteComment(writer, BAD_CAST "Common resource header") < 0)
		NOVA_EXP("CResource::SerializeToXmlFile: xmlTextWriterWriteComment fail", BAD_OPERATION);

	if(xmlTextWriterStartElement(writer, BAD_CAST "ResourceHeader") < 0)
		NOVA_EXP("CResource::SerializeToXmlFile: xmlTextWriterStartElement fail", BAD_OPERATION);

	if(xmlTextWriterWriteElement(writer, BAD_CAST "ResourceName", BAD_CAST mName.c_str()) < 0)
		NOVA_EXP("CResource::SerializeToXmlFile: xmlTextWriterWriteElement fail", BAD_OPERATION);

	if(xmlTextWriterWriteElement(writer, BAD_CAST "ResourceGroup", BAD_CAST mGroup.c_str()) < 0)
		NOVA_EXP("CResource::SerializeToXmlFile: xmlTextWriterWriteElement fail", BAD_OPERATION);

	if(xmlTextWriterStartElement(writer, BAD_CAST "ResourceData") < 0)
		NOVA_EXP("CResource::SerializeToXmlFile: xmlTextWriterStartElement fail", BAD_OPERATION);

// Resource manager attribute
	if(xmlTextWriterWriteAttribute(writer, BAD_CAST "ResourceFactory", BAD_CAST GetCreator()->GetResourceFactoryName().c_str()) < 0)
		NOVA_EXP("CImage::SerializeToXmlFileImpl: xmlTextWriterWriteAttribute fail", BAD_OPERATION);

	SerializeToXmlFileImpl(writer);

    xmlTextWriterEndDocument(writer);
	xmlFreeTextWriter(writer);
}
Exemple #12
0
void Pet::UpdateResistances(uint32 school)
{
    if (school > SPELL_SCHOOL_NORMAL)
    {
        float value  = GetTotalAuraModValue(UnitMods(UNIT_MOD_RESISTANCE_START + school));

        Unit *owner = GetOwner();
        // chained, use original owner instead
        if (owner && owner->GetTypeId() == TYPEID_UNIT && ((Creature*)owner)->GetEntry() == GetEntry())
            if (Unit *creator = GetCreator())
                owner = creator;

        // hunter and warlock pets gain 40% of owner's resistance
        if (owner && (getPetType() == HUNTER_PET || (getPetType() == SUMMON_PET && owner->getClass() == CLASS_WARLOCK)))
            value += float(owner->GetResistance(SpellSchools(school))) * 0.4f;

        SetResistance(SpellSchools(school), int32(value));
    }
    else
        UpdateArmor();
}
Exemple #13
0
// OutputToStream()
//  Outputs an ImageData instance as ASCII text to the stream provided.
void ImageData::OutputToStream( ostream &out ) {
  out << " Filename:             \"" << GetFilename() << "\"" << endl;
  out << "  File Format:         " << GetFileFormat() << "; \"" << ImageFileFormatStrings[ GetFileFormat() ] << "\"" << endl;
  out << "  File Size:           " << GetFileSize() << " bytes " << endl;
  out << endl;
  out << " File Data:" << endl;
  out << "  Bits Per Pixel:      " << GetBitsPerPixel() << endl;
  out << "  Compression:         " << GetCompression() << "; \"" << ImageCompressionModeStrings[ GetCompression() ] << "\"" << endl;
  out << "  DPI X/Y:             " << GetDPIX() << "/" <<  GetDPIY() << endl;
  out << "  Pixel Aspect Ration: " << GetPixelAspectNum() << "/" <<  GetPixelAspectDenom() << endl;
  out << "  Gamma Correction:    " << GetGammaNum() << "/" <<  GetGammaDenom() << endl;
  out << "  Thumbnail:           ";
  if( GetThumbnail() == NULL )
    out << "No" << endl;
  else
    out << "Yes" << endl;

  out << endl;
  out << " Creator Data:" << endl;
  out << "  Author:              \"" << GetAuthor() << "\"" << endl;
  out << "  Creator Program:     \"" << GetCreator() << "\"" << endl;
  out << "  Creator Version:     "   << GetCreatorVersion() << "." << GetCreatorRevision() << GetCreatorSubRev() << endl;
  out << "  Comment:             \"" << GetComment() << "\"" << endl;
  out << "  Job Name:            \"" << GetJobName() << "\"" << endl;
  out << "  Job Time:            "   << GetJobTime()[0] << ":" << GetJobTime()[1] << ":" << GetJobTime()[2] << endl;
  out << "  Date Stamp:          "   << GetDateStamp()[0] << "/" << GetDateStamp()[1] << "/" << GetDateStamp()[2] << "  "
                                     << GetDateStamp()[3] << ":" << GetDateStamp()[4] << ":" << GetDateStamp()[5] << endl;
  out << endl;

  out << " Image Data:" << endl;
  out << "  Width:               " << GetImage()->GetWidth() << endl;
  out << "  Height:              " << GetImage()->GetHeight() << endl;
  out << "  Type:                " << GetImage()->GetType() << "; \"" << ImageTypeStrings[ GetImage()->GetType() ] << "\"" << endl;
  out << "  Num Registers:       ";
  if( GetImage()->GetType() == IMAGE_INDEXED )
    out << GetImage()->GetNumRegisters() << endl;
  else
    out << "N/A" << endl;

}
void GUIStatusLayer::SetProjects(kmd::SessionContainer* sessions)
{
	const std::vector<kmd::SessionDetails*>& lst = sessions->GetSessions();
	std::vector<kmd::SessionDetails*>::const_iterator it = lst.begin();
	float y = 20;
	float h = 80;
	for (; it != lst.end();++it)
	{
		if (!(*it)->IsSession())
			continue;
		GUIProjectStatus* p = new GUIProjectStatus(GetCreator());
		p->SetPosition(math::vector2d(20, y));
		p->SetSize(math::vector2d(0, h));
		p->SetAnchorPosition(math::vector2d(20, 0));
		p->SetAnchorLeft(true);
		p->SetAnchorTop(true);
		p->SetAnchorRight(true);
		p->SetProject(*it);
		AddElement(p);
		y += h;
	}
}
Exemple #15
0
void CWaypoints::WriteOSM(const std::wstring& wstrFilename)
{
	try
	{
		COSMFileWriter OsmWriter(wstrFilename, GetCreator());
		int iOsmWptCount = 0;
		for (std::list<CPoint>::iterator it = m_Points.begin(); it != m_Points.end(); ++it)
		{
			if (isWptModel(it->m_wstrName)) continue;    // ignore models
			if (0 == it->m_OSMPropList.size()) continue; // ignore waypoints without osm tags
			bool bNameWritten = false;
			OsmWriter.AddNextWaypoint(it->m_dLatitude, it->m_dLongitude);
			iOsmWptCount++;
			for(std::vector<CStringProp>::iterator iter = it->m_OSMPropList.begin();
				iter != it->m_OSMPropList.end();
				iter++)
			{
				if (L"name" == iter->Name()) bNameWritten = true;
				if (0 == iter->Value().length()) continue; // ignore empty values
				OsmWriter.CurrentWpt()->addTag(iter->Name(), iter->Value());
			}
			if (!bNameWritten)
			{
				if (!IsDefaultWaypointName(it->m_wstrName))
					OsmWriter.CurrentWpt()->addTag(L"name", it->m_wstrName);
			}
		}
		wchar_t wcMsg[100];
		swprintf(wcMsg, 100, L("%d waypoints with OSM tags"), iOsmWptCount);
		MessageBox(NULL, wcMsg, L("File written"), MB_ICONEXCLAMATION);
	}
	catch (CGPXFileWriter::Error e)
	{
		MessageBox(NULL, e.c_str(), L("OSM write error"), MB_ICONEXCLAMATION);
	}
}
void GUIGraphPlotElement::Draw(const math::rectf*vp)
{
	if(!IsVisible())
		return;
	GUI::IGUIElement::Draw(vp);
	float alpha=0.5;
	math::rectf rc=GetDefaultRegion()->GetClippedRect();
	GetCreator()->GetActiveTheme()->drawSizableBox(GetCreator()->GetRenderQueue(),rc,0,mT("Frame"),video::SColor(1,1,1,alpha));
	GetCreator()->GetRenderQueue()->Flush();


	if(!m_graphs.size())
		return;

	GUI::IFont*font=gFontResourceManager.getFontByName(m_font.fontName);
	GraphList::iterator it=m_graphs.begin();
	math::rectf r;
	r.ULPoint=rc.ULPoint;
	r.BRPoint.x=rc.BRPoint.x;
	r.BRPoint.y=r.ULPoint.y+m_font.fontSize;
	float fontSpacing=rc.getHeight()/(m_graphs.size()+1);
	fontSpacing=math::Min(20.0f,fontSpacing);
	m_font.fontSize=fontSpacing;
	for (;it!=m_graphs.end();++it)
	{
		GraphInfo* g=it->second;
		g->color.A=alpha;
		GetCreator()->GetDevice()->draw2DLine(&g->points[0],g->currSample-1,g->color);
		if(font)
		{
			m_font.fontColor=g->color;
			m_font.fontColor.A=1;
			core::string msg=g->name+mT("@")+core::StringConverter::toString(g->lastVal,4);
			font->print(r,&m_font,&r,msg,GetCreator()->GetRenderQueue());
			r.ULPoint.y+=fontSpacing;
			r.BRPoint.y+=fontSpacing;
		}
	}
	GetCreator()->GetRenderQueue()->Flush();
}
Exemple #17
0
void Pet::UpdateAttackPowerAndDamage(bool ranged)
{
    if (ranged)
        return;

    float val = 0.0f;
    float bonusAP = 0.0f;
    UnitMods unitMod = UNIT_MOD_ATTACK_POWER;

    if (GetEntry() == 416)                                  // imp's attack power
        val = GetStat(STAT_STRENGTH) - 10.0f;
    else
        val = 2 * GetStat(STAT_STRENGTH) - 20.0f;

    Unit* owner = GetOwner();
    // chained, use original owner instead
    if (owner && owner->GetTypeId() == TYPEID_UNIT && ((Creature*)owner)->GetEntry() == GetEntry())
    {
        if (Unit* creator = GetCreator())
            owner = creator;
    }

    if (owner && owner->GetTypeId() == TYPEID_PLAYER)
    {
        if (getPetType() == HUNTER_PET)                     // hunter pets benefit from owner's attack power
        {
            bonusAP = owner->GetTotalAttackPowerValue(RANGED_ATTACK) * 0.22f;
            SetBonusDamage(int32(owner->GetTotalAttackPowerValue(RANGED_ATTACK) * 0.1287f));
        }
        // ghouls benefit from deathknight's attack power
        else if (getPetType() == SUMMON_PET && owner->getClass() == CLASS_DEATH_KNIGHT)
        {
            bonusAP = owner->GetTotalAttackPowerValue(BASE_ATTACK) * 0.82f;
            SetBonusDamage(int32(owner->GetTotalAttackPowerValue(BASE_ATTACK) * 0.8287f));
        }
        // demons benefit from warlocks shadow or fire damage
        else if (getPetType() == SUMMON_PET && owner->getClass() == CLASS_WARLOCK)
        {
            int32 fire  = int32(owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_FIRE)) - owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + SPELL_SCHOOL_FIRE);
            int32 shadow = int32(owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_SHADOW)) - owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + SPELL_SCHOOL_SHADOW);
            int32 maximum  = (fire > shadow) ? fire : shadow;
            if (maximum < 0)
                maximum = 0;
            SetBonusDamage(int32(maximum * 0.15f));
            bonusAP = maximum * 0.57f;
        }
        // water elementals benefit from mage's frost damage
        else if (getPetType() == SUMMON_PET && owner->getClass() == CLASS_MAGE)
        {
            int32 frost = int32(owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_FROST)) - owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + SPELL_SCHOOL_FROST);
            if (frost < 0)
                frost = 0;
            SetBonusDamage(int32(frost * 0.4f));
        }
    }

    SetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE, val + bonusAP);

    // in BASE_VALUE of UNIT_MOD_ATTACK_POWER for creatures we store data of meleeattackpower field in DB
    float base_attPower  = GetModifierValue(unitMod, BASE_VALUE) * GetModifierValue(unitMod, BASE_PCT);
    float attPowerMod = GetModifierValue(unitMod, TOTAL_VALUE);
    float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f;

    // UNIT_FIELD_(RANGED)_ATTACK_POWER field
    SetInt32Value(UNIT_FIELD_ATTACK_POWER, (int32)base_attPower);
    // UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field
    SetInt32Value(UNIT_FIELD_ATTACK_POWER_MODS, (int32)attPowerMod);
    // UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field
    SetFloatValue(UNIT_FIELD_ATTACK_POWER_MULTIPLIER, attPowerMultiplier);

    // automatically update weapon damage after attack power modification
    UpdateDamagePhysical(BASE_ATTACK);
}
IGUIElement* GUIWebPageOrganizer::Duplicate(){return new GUIWebPageOrganizer(GetCreator());}
Exemple #19
0
void Pet::UpdateAttackPowerAndDamage(bool ranged)
{
    if (ranged)
        return;

    float val = 0.0f;
    float bonusAP = 0.0f;
    UnitMods unitMod = UNIT_MOD_ATTACK_POWER;

    val = (GetStat(STAT_STRENGTH) - 20.0f) * 2;

    Unit* owner = GetOwner();

    // chained, use original owner instead
    if (owner && owner->GetTypeId() == TYPEID_UNIT && ((Creature*)owner)->GetEntry() == GetEntry())
        if (Unit *creator = GetCreator())
            owner = creator;

    if (owner && owner->GetTypeId()==TYPEID_PLAYER)
    {
        if (getPetType() == HUNTER_PET)                      //hunter pets benefit from owner's attack power
        {
            float ap_coeff = 0.22f;
            float sp_coeff = 0.1287f;
            //Wild Hunt
            uint32 bonus_id = 0;
            if (HasSpell(62762))
                bonus_id = 62762;
            else if (HasSpell(62758))
                bonus_id = 62758;
            if (const SpellEntry *bonusProto = sSpellStore.LookupEntry(bonus_id))
            {
                ap_coeff *= 1 + bonusProto->CalculateSimpleValue(EFFECT_INDEX_1) / 100.0f;
                sp_coeff *= 1 + bonusProto->CalculateSimpleValue(EFFECT_INDEX_1) / 100.0f;
            }

            bonusAP = owner->GetTotalAttackPowerValue(RANGED_ATTACK) * ap_coeff;
            SetBonusDamage( int32(owner->GetTotalAttackPowerValue(RANGED_ATTACK) * sp_coeff));
        }      
        else if (getPetType() == SUMMON_PET)
        {
            switch(owner->getClass())
            {
                case CLASS_WARLOCK:
                {
                    //demons benefit from warlocks shadow or fire damage
                    int32 fire  = int32(owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_FIRE)) - owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + SPELL_SCHOOL_FIRE);
                    int32 shadow = int32(owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_SHADOW)) - owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + SPELL_SCHOOL_SHADOW);
                    int32 maximum  = (fire > shadow) ? fire : shadow;
                    if (maximum < 0)
                        maximum = 0;
                    SetBonusDamage(int32(maximum * 0.15f));
                    bonusAP = maximum * 0.57f;
                    break;
                }
                case CLASS_MAGE:
                {
                    //water elementals benefit from mage's frost damage
                    int32 frost = int32(owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_FROST)) - owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + SPELL_SCHOOL_FROST);
                    if (frost < 0)
                        frost = 0;
                    SetBonusDamage(int32(frost * 0.4f));
                    break;
                }
                case CLASS_SHAMAN:
                {
                    float coeff = 0.3f;
                    //Glyph of Feral Spirit
                    if (Aura *glyph = owner->GetDummyAura(63271))
                        coeff += glyph->GetModifier()->m_amount / 100.0f;
                    bonusAP += coeff * owner->GetTotalAttackPowerValue(BASE_ATTACK);
                    break;
                }
                case CLASS_DRUID:
                {
                    //Guessed
                    float coeff = 0.55f;
                    int32 sp = int32(owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_NATURE)) - owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + SPELL_SCHOOL_NATURE);
                    bonusAp += coeff * sp;
                    break;    
                }
            }
        }
        else if (getPetType() == GUARDIAN_PET)
            if (owner->getClass() == CLASS_DEATH_KNIGHT)
                bonusAP += owner->GetTotalAttackPowerValue(BASE_ATTACK) * 0.4f;
    }

    SetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE, val + bonusAP);

    //in BASE_VALUE of UNIT_MOD_ATTACK_POWER for creatures we store data of meleeattackpower field in DB
    float base_attPower  = GetModifierValue(unitMod, BASE_VALUE) * GetModifierValue(unitMod, BASE_PCT);
    float attPowerMod = GetModifierValue(unitMod, TOTAL_VALUE);
    float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f;

    //UNIT_FIELD_(RANGED)_ATTACK_POWER field
    SetInt32Value(UNIT_FIELD_ATTACK_POWER, (int32)base_attPower);
    //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field
    SetInt32Value(UNIT_FIELD_ATTACK_POWER_MODS, (int32)attPowerMod);
    //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field
    SetFloatValue(UNIT_FIELD_ATTACK_POWER_MULTIPLIER, attPowerMultiplier);

    //automatically update weapon damage after attack power modification
    UpdateDamagePhysical(BASE_ATTACK);
}
int IEffectPainter::GetInitialLifetime (void)
	{
	return GetCreator()->GetLifetime();
	}
Exemple #21
0
bool Pet::UpdateStats(Stats stat)
{
    if (stat > STAT_SPIRIT)
        return false;

    // value = ((base_value * base_pct) + total_value) * total_pct
    float value  = GetTotalStatValue(stat);
    CreatureInfo const *cinfo = GetCreatureInfo(); 

    Unit *owner = GetOwner();

    // chained, use original owner instead
    if (owner && owner->GetTypeId() == TYPEID_UNIT && ((Creature*)owner)->GetEntry() == GetEntry())
        if (Unit *creator = GetCreator())
            owner = creator;

    if (owner && owner->GetTypeId() == TYPEID_PLAYER)
    {
        float scale_coeff = 0.0f;
        switch(stat)
        {
            case STAT_STRENGTH:
            {
                if (owner->getClass() == CLASS_DEATH_KNIGHT)
                {
                    if (getPetType() == SUMMON_PET)
                    {
                        scale_coeff = 0.7f;
                        // Ravenous Dead
                        if (SpellEntry const* spell = ((Player*)owner)->GetKnownTalentRankById(1934))
                            scale_coeff *= 1.0f + spell->CalculateSimpleValue(EFFECT_INDEX_1) / 100.0f;
                        // Glyph of Ghoul
                        if (Aura *glyph = owner->GetDummyAura(58686))
                            scale_coeff += glyph->GetModifier()->m_amount / 100.0f;
                    }
                }
                break;
            }
            case STAT_STAMINA:
            {
                scale_coeff = 0.3f;
                switch (owner->getClass())
                {
                    case CLASS_HUNTER:
                    {
                        scale_coeff = 0.45f;
                        //Wild Hunt
                        uint32 bonus_id = 0;
                        if (HasSpell(62762))
                            bonus_id = 62762;
                        else if (HasSpell(62758))
                            bonus_id = 62758;
                        if (const SpellEntry *bonusProto = sSpellStore.LookupEntry(bonus_id)) 
                            scale_coeff *= 1 + bonusProto->CalculateSimpleValue(EFFECT_INDEX_0) / 100.0f;
                        break;
                    }
                    case CLASS_WARLOCK:
                    {
                        scale_coeff = 0.75f;
                        break;
                    }
                    case CLASS_DEATH_KNIGHT:
                    {
                        if (getPetType() == SUMMON_PET)
                        {
                            // Ravenous Dead
                            if (owner->GetTypeId() == TYPEID_PLAYER)
                                if (SpellEntry const* spell = ((Player*)owner)->GetKnownTalentRankById(1934))
                                    scale_coeff *= 1.0f + spell->CalculateSimpleValue(EFFECT_INDEX_1) / 100.0f;
                            // Glyph of Ghoul
                            if (Aura *glyph = owner->GetDummyAura(58686))
                                scale_coeff += glyph->GetModifier()->m_amount / 100.0f;
                        }
                        break; 
                    }
                    case CLASS_DRUID:
                    {
                        
                        //For treants, use 70% of stamina / 3 treants, guessed
                        scale_coeff = 0.7f / 3.0f; 
                        break;
                    }
                }
                break;
            }
            case STAT_INTELLECT:
            {
                //warlock's and mage's pets gain 30% of owner's intellect
                if (getPetType() == SUMMON_PET)
                {
                    if (owner && (owner->getClass() == CLASS_WARLOCK || owner->getClass() == CLASS_MAGE) )
                        scale_coeff = 0.3f;
                }
                break;
            }
        }
        value += float(owner->GetStat(stat)) * scale_coeff;
    }
    SetStat(stat, int32(value));

    switch(stat)
    {
        case STAT_STRENGTH:         UpdateAttackPowerAndDamage();        break;
        case STAT_AGILITY:          UpdateArmor();                       break;
        case STAT_STAMINA:          UpdateMaxHealth();                   break;
        case STAT_INTELLECT:        UpdateMaxPower(POWER_MANA);          break;
        case STAT_SPIRIT:
        default:
            break;
    }

    return true;
}
void GUICheckBox::Draw(const math::rectf*vp)
{
	if(!IsVisible())return;

	m_component->rc=GetDefaultRegion()->GetClippedRect();
	math::rectf oldScissor=GetCreator()->GetDevice()->getScissorRect();
	GetCreator()->GetDevice()->setScissorRect(m_component->rc);
	m_component->Draw();
	GetCreator()->GetRenderQueue()->Flush();
	GetCreator()->GetDevice()->setScissorRect(oldScissor);
/*
	math::rectf tChBox=tRect;
	tChBox.BRPoint=tChBox.ULPoint+skin->getRect(0,math::rectf(0,0,24,24),mT("CheckBox")).getSize();


	tRect.ULPoint.x+=tChBox.getWidth();
	float yCoord=0;

	int state;
	int butState;
	switch (m_state){
		case EC_UnChecked:
			yCoord=0.0f;
			state=0;
			butState=0;
			break;
		case EC_Checked:
			yCoord=0.25f;
			state=1;
			butState=2;
			break;
		case EC_MouseOn:
			yCoord=0.5f;
			state=2;
			butState=1;
			break;
		case EC_MouseDown:
			yCoord=0.75f;
			state=3;
			butState=2;
			break;
	}

	tRect.clipRect(clipRect);
	video::SColor bclr=Color();
	bclr.A=AlphaEffect ? Alpha:Color().A;
	math::rectf coordsRect(0,yCoord,1,yCoord+0.25f);
	
	video::SColor clr;
	if(!PushButton()){
		if(BGOpaque() && !bkTexture->GetTexture())
			skin->drawBox(getManager()->GetRenderQueue(),tRect,bclr,bclr*0.5,&clipRect);
		
		if(bkTexture->GetTexture())
			device->draw2DImage(tChBox,bkTexture,video::SColor(255,255,255,bclr.A),0,&coordsRect);
		else{
			if(Checked())
			{
				skin->drawBox(getManager()->GetRenderQueue(),tChBox,mT("CheckBox"),state,bclr,&(clipRect+1),true);
			}else
				skin->drawBox(getManager()->GetRenderQueue(),tChBox,mT("CheckBox"),state,bclr,&(clipRect+1),false);
		}

		if(tChBox.isValid()){
			tChBox.ULPoint+=2;
			tChBox.BRPoint-=2;
		}
			
	}else
	{
		if(Checked()){
			clr=Color();
			clr.A=AlphaEffect ? Alpha:bclr.A;
			skin->drawSizableBox(getManager()->GetRenderQueue(),tRect,butState,mT("PushButton"),bclr,&(clipRect+1));
		}else
		{
			clr=Color();
			clr.A=AlphaEffect ? Alpha:bclr.A;
			skin->drawSizableBox(getManager()->GetRenderQueue(),tRect,butState,mT("PushButton"),bclr,&clipRect);
		}
	}


	if(guiMngr->hasFocus(this))
	{
		math::rectf rc=tRect;
		rc.BRPoint-=4;
		rc.ULPoint+=4;
		guiMngr->getDevice()->draw2DRectangle(rc,80,0,&clipRect);
	}
	if(ShowCaption){
		IFont*font=gFontResourceManager.getFontByName(m_FontAttributes.fontName);
		if(!font)
			return;
		video::SColor clr,oldClr;
		clr=oldClr=m_FontAttributes.fontColor;
		clr.A=AlphaEffect ? Alpha:oldClr.A;
		m_FontAttributes.fontColor=clr;
		if(Enable)
			font->print(tRect,&m_FontAttributes,&clipRect,getRenderString(),guiMngr->GetRenderQueue());
		else{
			m_FontAttributes.fontColor=video::SColor(128,128,128,clr.A);
			font->print(tRect,&m_FontAttributes,&clipRect,getRenderString(),guiMngr->GetRenderQueue());
		}
		m_FontAttributes.fontColor=oldClr;

	}
		
	GUIElement::draw(dt);*/
}