예제 #1
0
/**
 * Sends a mail.
 *
 * @param receiver             The MailReceiver to which this mail is sent.
 * @param sender               The MailSender from which this mail is originated.
 * @param checked              The mask used to specify the mail.
 * @param deliver_delay        The delay after which the mail is delivered in seconds
 */
void MailDraft::SendMailTo(MailReceiver const& receiver, MailSender const& sender, MailCheckMask checked, uint32 deliver_delay, uint32 expire_delay)
{
    Player* pReceiver = receiver.GetPlayer();               // can be nullptr

    uint32 pReceiverAccount = 0;
    if (!pReceiver)
        pReceiverAccount = sObjectMgr.GetPlayerAccountIdByGUID(receiver.GetPlayerGuid());

    if (!pReceiver && !pReceiverAccount)                    // receiver not exist
    {
        deleteIncludedItems(true);
        return;
    }

    bool has_items = !m_items.empty();

    // generate mail template items for online player, for offline player items will generated at open
    if (pReceiver)
    {
        if (prepareItems(pReceiver))
            has_items = true;
    }

    uint32 mailId = sObjectMgr.GenerateMailID();

    time_t deliver_time = time(nullptr) + deliver_delay;

    if (!expire_delay)
    {
        // expire time if COD 3 days, if no COD 30 days, if auction sale pending 1 hour
        // auction mail without any items and money (auction sale note) pending 1 hour
        if (sender.GetMailMessageType() == MAIL_AUCTION && m_items.empty() && !m_money)
            expire_delay = HOUR;
        // default case: expire time if COD 3 days, if no COD 30 days
        else
            expire_delay = (m_COD > 0) ? 3 * DAY : 30 * DAY;
    }

    time_t expire_time = deliver_time + expire_delay;

    // Add to DB
    std::string safe_subject = GetSubject();

    CharacterDatabase.BeginTransaction();
    CharacterDatabase.escape_string(safe_subject);
    CharacterDatabase.PExecute("INSERT INTO mail (id,messageType,stationery,mailTemplateId,sender,receiver,subject,itemTextId,has_items,expire_time,deliver_time,money,cod,checked) "
                               "VALUES ('%u', '%u', '%u', '%u', '%u', '%u', '%s', '%u', '%u', '" UI64FMTD "','" UI64FMTD "', '%u', '%u', '%u')",
                               mailId, sender.GetMailMessageType(), sender.GetStationery(), GetMailTemplateId(), sender.GetSenderId(), receiver.GetPlayerGuid().GetCounter(), safe_subject.c_str(), GetBodyId(), (has_items ? 1 : 0), (uint64)expire_time, (uint64)deliver_time, m_money, m_COD, checked);

    for (MailItemMap::const_iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
    {
        Item* item = mailItemIter->second;
        CharacterDatabase.PExecute("INSERT INTO mail_items (mail_id,item_guid,item_template,receiver) VALUES ('%u', '%u', '%u','%u')",
                                   mailId, item->GetGUIDLow(), item->GetEntry(), receiver.GetPlayerGuid().GetCounter());
    }
    CharacterDatabase.CommitTransaction();

    // For online receiver update in game mail status and data
    if (pReceiver)
    {
        pReceiver->AddNewMailDeliverTime(deliver_time);

        Mail* m = new Mail;
        m->messageID = mailId;
        m->mailTemplateId = GetMailTemplateId();
        m->subject = GetSubject();
        m->itemTextId = GetBodyId();
        m->money = GetMoney();
        m->COD = GetCOD();

        for (MailItemMap::const_iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
        {
            Item* item = mailItemIter->second;
            m->AddItem(item->GetGUIDLow(), item->GetEntry());
        }

        m->messageType = sender.GetMailMessageType();
        m->stationery = sender.GetStationery();
        m->sender = sender.GetSenderId();
        m->receiverGuid = receiver.GetPlayerGuid();
        m->expire_time = expire_time;
        m->deliver_time = deliver_time;
        m->checked = checked;
        m->state = MAIL_STATE_UNCHANGED;

        pReceiver->AddMail(m);                           // to insert new mail to beginning of maillist

        if (!m_items.empty())
        {
            for (MailItemMap::iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
                pReceiver->AddMItem(mailItemIter->second);
        }
    }
    else if (!m_items.empty())
        deleteIncludedItems();
}
예제 #2
0
파일: Mail.cpp 프로젝트: krik05/mangos
void MailDraft::SendMailTo(MailReceiver const& receiver, MailSender const& sender, MailCheckMask checked, uint32 deliver_delay)
{
    Player* pReceiver = receiver.GetPlayer();               // can be NULL
    
    if (pReceiver)
        prepareItems(pReceiver);                            // generate mail template items


    uint32 mailId = objmgr.GenerateMailID();

    time_t deliver_time = time(NULL) + deliver_delay;

    uint32 expire_delay;
    // auction mail without any items and money (auction sale note) pending 1 hour
    if (sender.GetMailMessageType() == MAIL_AUCTION && m_items.empty() && !m_money)
        expire_delay = HOUR;
    // mail from battlemaster (rewardmarks) should last only one day
    else if (sender.GetMailMessageType() == MAIL_CREATURE && sBattleGroundMgr.GetBattleMasterBG(sender.GetSenderId()) != BATTLEGROUND_TYPE_NONE)
        expire_delay = DAY;
    // default case: expire time if COD 3 days, if no COD 30 days
    else
        expire_delay = (m_COD > 0) ? 3 * DAY : 30 * DAY;

    time_t expire_time = deliver_time + expire_delay;

    // Add to DB
    std::string safe_subject = GetSubject();

    CharacterDatabase.BeginTransaction();
    CharacterDatabase.escape_string(safe_subject);
    CharacterDatabase.PExecute("INSERT INTO mail (id,messageType,stationery,mailTemplateId,sender,receiver,subject,itemTextId,has_items,expire_time,deliver_time,money,cod,checked) "
        "VALUES ('%u', '%u', '%u', '%u', '%u', '%u', '%s', '%u', '%u', '" UI64FMTD "','" UI64FMTD "', '%u', '%u', '%d')",
        mailId, sender.GetMailMessageType(), sender.GetStationery(), GetMailTemplateId(), sender.GetSenderId(), receiver.GetPlayerGUIDLow(), safe_subject.c_str(), GetBodyId(), (m_items.empty() ? 0 : 1), (uint64)expire_time, (uint64)deliver_time, m_money, m_COD, checked);

    for(MailItemMap::const_iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
    {
        Item* item = mailItemIter->second;
        CharacterDatabase.PExecute("INSERT INTO mail_items (mail_id,item_guid,item_template,receiver) VALUES ('%u', '%u', '%u','%u')", mailId, item->GetGUIDLow(), item->GetEntry(), receiver.GetPlayerGUIDLow());
    }
    CharacterDatabase.CommitTransaction();

    // For online receiver update in game mail status and data
    if (pReceiver)
    {
        pReceiver->AddNewMailDeliverTime(deliver_time);

        if (pReceiver->IsMailsLoaded())
        {
            Mail *m = new Mail;
            m->messageID = mailId;
            m->mailTemplateId = GetMailTemplateId();
            m->subject = GetSubject();
            m->itemTextId = GetBodyId();
            m->money = GetMoney();
            m->COD = GetCOD();

            for(MailItemMap::const_iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
            {
                Item* item = mailItemIter->second;
                m->AddItem(item->GetGUIDLow(), item->GetEntry());
            }

            m->messageType = sender.GetMailMessageType();
            m->stationery = sender.GetStationery();
            m->sender = sender.GetSenderId();
            m->receiver = receiver.GetPlayerGUIDLow();
            m->expire_time = expire_time;
            m->deliver_time = deliver_time;
            m->checked = checked;
            m->state = MAIL_STATE_UNCHANGED;

            pReceiver->AddMail(m);                           // to insert new mail to beginning of maillist

            if (!m_items.empty())
            {
                for(MailItemMap::iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
                    pReceiver->AddMItem(mailItemIter->second);
            }
        }
        else if (!m_items.empty())
            deleteIncludedItems();
    }
    else if (!m_items.empty())
        deleteIncludedItems();
}
예제 #3
0
bool ChunkyBoneGeometry::CreateJoint(ChunkyPhysics* structure, PhysicsManager* physics, unsigned physics_fps) {
	bool ok = false;
	if (body_data_.parent_) {
		if (GetBoneType() == kBonePosition) {
			// Need not do jack. It's not a physical object.
			ok = true;
		} else if (body_data_.joint_type_ == kJointExclude) {
			ok = physics->Attach(GetBodyId(), body_data_.parent_->GetBodyId());
		} else if (body_data_.joint_type_ == kJointFixed) {
			ok = physics->Attach(GetBodyId(), body_data_.parent_->GetBodyId());
		} else if (body_data_.joint_type_ == kJointSuspendHinge || body_data_.joint_type_ == kJointHinge2) {
			// Calculate axis from given euler angles.
			vec3 suspension_axis(-1, 0, 0);
			vec3 hinge_axis(0, 0, 1);
			quat rotator;
			rotator.SetEulerAngles(body_data_.parameter_[kParamEulerTheta], 0, body_data_.parameter_[kParamEulerPhi]);
			suspension_axis = rotator*suspension_axis;
			hinge_axis = rotator*hinge_axis;

			joint_id_ = physics->CreateHinge2Joint(body_data_.parent_->GetBodyId(),
				GetBodyId(), structure->GetTransformation(this).GetPosition(),
				suspension_axis, hinge_axis);
			physics->SetJointParams(joint_id_, body_data_.parameter_[kParamLowStop], body_data_.parameter_[kParamHighStop], 0);
			physics->SetSuspension(joint_id_, 1/(float)physics_fps, body_data_.parameter_[kParamSpringConstant],
				body_data_.parameter_[kParamSpringDamping]);
			physics->SetAngularMotorRoll(joint_id_, 0, 0);
			physics->SetAngularMotorTurn(joint_id_, 0, 0);
			ok = true;
		} else if (body_data_.joint_type_ == kJointHinge) {
			// Calculate axis from given euler angles.
			vec3 hinge_axis(0, 0, 1);
			quat hinge_rotator;
			hinge_rotator.SetEulerAngles(body_data_.parameter_[kParamEulerTheta], 0, body_data_.parameter_[kParamEulerPhi]);
			hinge_axis = hinge_rotator*hinge_axis;

			const xform& body_transform = structure->GetTransformation(this);
			const vec3 anchor = body_transform.GetPosition() + GetOriginalOffset();
			joint_id_ = physics->CreateHingeJoint(body_data_.parent_->GetBodyId(),
				GetBodyId(), anchor, hinge_axis);
			physics->SetJointParams(joint_id_, body_data_.parameter_[kParamLowStop], body_data_.parameter_[kParamHighStop], body_data_.bounce_);
			physics->SetAngularMotorTurn(joint_id_, 0, 0);
			//physics->GetAxis1(joint_id_, hinge_axis);
			ok = true;
		} else if (body_data_.joint_type_ == kJointSlider) {
			// Calculate axis from given euler angles.
			vec3 axis(0, 0, 1);
			quat rotator;
			rotator.SetEulerAngles(body_data_.parameter_[kParamEulerTheta], 0, body_data_.parameter_[kParamEulerPhi]);
			axis = rotator*axis;

			joint_id_ = physics->CreateSliderJoint(body_data_.parent_->GetBodyId(),
				GetBodyId(), axis);
			physics->SetJointParams(joint_id_, body_data_.parameter_[kParamLowStop], body_data_.parameter_[kParamHighStop], body_data_.bounce_);
			physics->SetMotorTarget(joint_id_, 0, 0);
			ok = true;
		} else if (body_data_.joint_type_ == kJointUniversal) {
			// Calculate axis from given euler angles.
			vec3 axis1(0, 0, 1);
			vec3 axis2(0, 1, 0);
			quat rotator;
			rotator.SetEulerAngles(body_data_.parameter_[kParamEulerTheta], 0, body_data_.parameter_[kParamEulerPhi]);
			axis1 = rotator*axis1;
			axis2 = rotator*axis2;

			const xform& body_transform = structure->GetTransformation(this);
			const vec3 anchor = body_transform.GetPosition() +
				vec3(body_data_.parameter_[kParamOffsetX], body_data_.parameter_[kParamOffsetY], body_data_.parameter_[kParamOffsetZ]);
			joint_id_ = physics->CreateUniversalJoint(body_data_.parent_->GetBodyId(),
				GetBodyId(), anchor, axis1, axis2);
			physics->SetJointParams(joint_id_, body_data_.parameter_[kParamLowStop], body_data_.parameter_[kParamHighStop], 0);
			/*physics->SetJointParams(joint_id_, body_data_.parameter_[kParamLowStop], body_data_.parameter_[kParamHighStop], 0);
			physics->SetSuspension(joint_id_, 1/(float)physics_fps, body_data_.parameter_[0],
				body_data_.parameter_[1]);
			physics->SetAngularMotorRoll(joint_id_, 0, 0);
			physics->SetAngularMotorTurn(joint_id_, 0, 0);*/
			ok = true;
		} else if (body_data_.joint_type_ == kJointBall) {
			const xform& body_transform = structure->GetTransformation(this);
			const vec3 anchor = body_transform.GetPosition() +
				vec3(body_data_.parameter_[kParamOffsetX], body_data_.parameter_[kParamOffsetY], body_data_.parameter_[kParamOffsetZ]);
			joint_id_ = physics->CreateBallJoint(body_data_.parent_->GetBodyId(),
				GetBodyId(), anchor);
			/*physics->SetJointParams(joint_id_, body_data_.parameter_[kParamLowStop], body_data_.parameter_[kParamHighStop], 0);
			physics->SetJointParams(joint_id_, body_data_.parameter_[kParamLowStop], body_data_.parameter_[kParamHighStop], 0);
			physics->SetSuspension(joint_id_, 1/(float)physics_fps, body_data_.parameter_[0],
				body_data_.parameter_[1]);
			physics->SetAngularMotorRoll(joint_id_, 0, 0);
			physics->SetAngularMotorTurn(joint_id_, 0, 0);*/
			ok = true;
		} else {
			deb_assert(false);
		}
	} else {
		deb_assert(body_data_.joint_type_ == kJointExclude);
		ok = true;
	}
	deb_assert(ok);
	return (ok);
}