short Unit::GetACDamage(int damage, Unit *pTarget) { // This isn't applicable to NPCs. if (isNPC() || pTarget->isNPC()) return damage; #ifdef EBENEZER if (pTarget->isDead()) return 0; CUser * pUser = TO_USER(this); uint8 weaponSlots[] = { RIGHTHAND, LEFTHAND }; foreach_array (slot, weaponSlots) { _ITEM_TABLE * pWeapon = pUser->GetItemPrototype(slot); if (pWeapon == nullptr) continue; if (pWeapon->isDagger()) damage -= damage * pTarget->m_sDaggerR / 200; else if (pWeapon->isSword()) damage -= damage * pTarget->m_sSwordR / 200; else if (pWeapon->isAxe()) damage -= damage * pTarget->m_sAxeR / 200; else if (pWeapon->isMace()) damage -= damage * pTarget->m_sMaceR / 200; else if (pWeapon->isSpear()) damage -= damage * pTarget->m_sSpearR / 200; else if (pWeapon->isBow()) damage -= damage * pTarget->m_sBowR / 200; }
// Process calculated launches for individual objects. (currently this is for processing AI launches) void GameObj::doLaunch() { GameObj* newAmmo = nextAmmo(); if(newAmmo != NULL && launch.launchTriggered) { if(!isNPC()) { launch.angle += 90; } //newAmmo->body->SetActive(true); //newAmmo->body->SetAwake(true); //newAmmo->goSettings.setHP(newAmmo->goSettings.getHPMax()); //newAmmo->goSettings.setHP(1); //setGroundContact(false); newAmmo->resetObjectState(); newAmmo->goSettings.setInitVecAngle(launch.angle); newAmmo->goSettings.setCurrentVecAngle(launch.angle); newAmmo->goSettings.setVelocityMax(0); newAmmo->goSettings.setInitLinearVelocity(launch.velocity); newAmmo->body->SetTransform(this->body->GetPosition(), Util::deg2Rad(launch.angle)); newAmmo->body->SetLinearVelocity(launch.velocity); newAmmo->body->SetAngularDamping(.01); newAmmo->goSettings.setTeam(goSettings.isNPC()); newAmmo->body->GetFixtureList()->SetFilterData(newAmmo->getFixtureCollisionFilter()); launch.launchTriggered = false; } }
void GameObj::addContact(GameObj *enemy) { if(enemy == NULL) { groundContact = true; } else if(enemy->isNPC() != isNPC()) { // contacts++; if(enemy->getType() != Settings::OBJ_T_BULLET) { addEnemy(enemy); } } }
void Character::collisionAction(Character *c) { if(!c || (c->isNPC() || !isNPC()) || (c->isPlayer() || !isPlayer())) { // Stop movement timer m_movementTimer.stop(); // Update collision state m_inCollision = true; // Exit function to avoid problems if c == NULL return; } if(c->isMonster() && isPlayer()) { // Hurt player hurt(m_x + m_hitboxW / 2 - c->x() + c->hitboxW() / 2, m_y + m_hitboxH / 2 - c->y() + c->hitboxH() / 2); } }
TRIGGER( equip )(obj equippedon) { if(isNPC(equippedon)) { return(0x01); } if(getCompileFlag(0x01)) { if(hasScript(equippedon, "orderguild")) { return(0x01); } } else { if(Q4SN(equippedon) >= 0x05) { return(0x01); } } Q4HV(); return(0x00); }