本文整理汇总了C++中P_CHAR::getWeapon方法的典型用法代码示例。如果您正苦于以下问题:C++ P_CHAR::getWeapon方法的具体用法?C++ P_CHAR::getWeapon怎么用?C++ P_CHAR::getWeapon使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类P_CHAR
的用法示例。
在下文中一共展示了P_CHAR::getWeapon方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DoCombat
void cCombat::DoCombat(P_CHAR pc_attacker, unsigned int currenttime)
{
int x, bowtype=0;// spamanachecking, tmp;
if ( pc_attacker == NULL )
return;
if (pc_attacker->free) return;
P_ITEM pWeapon=pc_attacker->getWeapon();
P_CHAR pc_defender = FindCharBySerial(pc_attacker->targ);
/*if (pc_attacker->priv2&2) //The char is paralyzed
{
sysmessage(calcSocketFromChar(pc_attacker), "You are frozen and cannot attack.");
return;
}*/
if ((pc_defender == NULL) || (pc_defender->isPlayer() && !online(pc_defender) || pc_defender->isHidden()) && pc_attacker->war)
{
pc_attacker->war=false; // LB
pc_attacker->timeout=0;
pc_attacker->attacker = INVALID_SERIAL;
pc_attacker->resetAttackFirst();
return;
}
if (( pc_attacker->isNpc() || online(pc_attacker) ) && pc_defender != NULL )
{
if (pc_defender == NULL) return;
if (pc_defender->free) return;
if (pc_attacker->dispz > (pc_defender->dispz +10)) return;//FRAZAI
if (pc_attacker->dispz < (pc_defender->dispz -10)) return;//FRAZAI
if ((pc_defender->isNpc() && pc_defender->npcaitype!=17) || (online(pc_defender) && !pc_defender->dead) ) // ripper
{
if (chardist( pc_attacker, pc_defender ) > SrvParams->attack_distance())
{
if (pc_attacker->npcaitype==4 && pc_attacker->inGuardedArea()) // changed from 0x40 to 4, LB
{
pc_attacker->moveTo(pc_defender->pos);
teleport(pc_attacker);
soundeffect2(pc_attacker, 0x01FE); // crashfix, LB
staticeffect(pc_attacker, 0x37, 0x2A, 0x09, 0x06);
npctalkall(pc_attacker,"Halt, scoundrel!",1);
}
else
{ // else -> npcaityes != 4
pc_attacker->targ = INVALID_SERIAL;
pc_attacker->timeout=0;
P_CHAR pc = FindCharBySerial(pc_attacker->attacker);
if (pc != NULL)
{
pc->resetAttackFirst();
pc->attacker = INVALID_SERIAL; // lb crashfix
}
pc_attacker->attacker=INVALID_SERIAL;
pc_attacker->resetAttackFirst();
if (pc_attacker->isNpc() && pc_attacker->npcaitype!=17 && !pc_attacker->dead && pc_attacker->war)
npcToggleCombat(pc_attacker); // ripper
}
}
else
{
if (pc_attacker->targ == INVALID_SERIAL)
{
npcsimpleattacktarget(pc_attacker, pc_defender);
x=(((100-pc_attacker->effDex())*MY_CLOCKS_PER_SEC)/25)+(1*MY_CLOCKS_PER_SEC); //Yet another attempt.
pc_attacker->timeout=currenttime+x;
return;
}
if (Combat->TimerOk(pc_attacker))
{
int los = line_of_sight(-1, pc_attacker->pos, pc_defender->pos, WALLS_CHIMNEYS+DOORS+FLOORS_FLAT_ROOFING);
UOXSOCKET s1 = calcSocketFromChar(pc_attacker);
int fightskill=Skills->GetCombatSkill(pc_attacker);
x=0;
if (fightskill==ARCHERY)
{
if (los)
{
int arrowsquant;
bowtype=Combat->GetBowType(pc_attacker);
if (bowtype==1)
arrowsquant=getamount(pc_attacker, 0x0F3F);
else
arrowsquant=getamount(pc_attacker, 0x1BFB);
if (arrowsquant>0)
x=1;
//else
// sysmessage(s1, "You are out of ammunitions!"); //-Fraz- this message can cause problems removed
}
}
if ( chardist( pc_attacker, pc_defender )<2 && fightskill!=ARCHERY ) x=1;
if (x)
{
// - Do stamina maths - AntiChrist (6) -
if(abs(SrvParams->attackstamina())>0 && !pc_attacker->isGM())
{
if((SrvParams->attackstamina()<0)&&(pc_attacker->stm<abs(SrvParams->attackstamina())))
{
sysmessage(s1, tr("You are too tired to attack."));
SetWeaponTimeout(pc_attacker, pWeapon);
//.........这里部分代码省略.........
示例2: CombatOnFoot
//play animation for weapon in hand for combat on foot //kolours - (09/20/98)
void cCombat::CombatOnFoot(P_CHAR pc)
{
if ( pc == NULL ) return;
P_ITEM pWeapon=pc->getWeapon();
int m = rand()%4; //randomize the animation sequence
if (pWeapon)
{
short id = pWeapon->id();
if (IsBow(id))
{
npcaction(pc, 0x12); //bow
return;
}
if (IsCrossbow(id) || IsHeavyCrossbow(id))
{
npcaction(pc, 0x13); //crossbow - regular
return;
}
if (IsSword(id))
{
switch (m) //swords
{
case 0: npcaction(pc, 0x0D); return; //side swing
case 1: npcaction(pc, 0x0A); return; //poke
default: npcaction(pc, 0x09); return; //top-down swing
}
}
if (IsMace1H(id))
{
switch (m) //maces
{
case 0: npcaction(pc, 0x0D); return; //side swing
default: npcaction(pc, 0x09); return; //top-down swing
}
}
if (IsMace2H(id) || IsAxe(id))
{
switch (m)
{
case 0: npcaction(pc, 0x0D); return; //2H top-down
case 1: npcaction(pc, 0x0C); return; //2H swing
default: npcaction(pc, 0x0D); return; //2H top-down
}
}
if (IsFencing1H(id)) // one handed fencing
{
switch (m) //fencing
{
case 0: npcaction(pc, 0x09); return; //top-down
case 1: npcaction(pc, 0x0D); return; //side-swipe
default: npcaction(pc, 0x0A); return; //default: poke
}
}
if (IsFencing2H(id)) //pitchfork & spear
{
switch (m) //pitchfork
{
case 0: npcaction(pc, 0x0D); return; //top-down
default: npcaction(pc, 0x0E); return; //default: 2-handed poke
}
}
} // end of !=-1
else
{
switch (m) //fist fighting
{
case 0: npcaction(pc, 0x0A); return; //fist straight-punch
case 1: npcaction(pc, 0x09); return; //fist top-down
default: npcaction(pc, 0x1F); return; //default: //fist over-head
}
}
}
示例3: CombatHit
// CombatHit now expects that LineOfSight has been checked before (Duke, 10.7.2001)
void cCombat::CombatHit(P_CHAR pc_attacker, P_CHAR pc_deffender, unsigned int currenttime, short los)
{
char hit;
if (pc_deffender == NULL || pc_attacker == NULL)
return;
UOXSOCKET s1=calcSocketFromChar(pc_attacker), s2=calcSocketFromChar(pc_deffender);
unsigned short fightskill = Skills->GetCombatSkill(pc_attacker), bowtype = Combat->GetBowType(pc_attacker),splitnum,splitcount,hitin;
unsigned int basedamage;
int damage; // removed from unsigne by Magius(CHE)
signed int x;
// Magius(CHE) - For armour absorbtion system
int maxabs, maxnohabs, tmpj;
P_ITEM pWeapon=pc_attacker->getWeapon();// get the weapon item only once
if (pWeapon && !(rand()%50) // a 2 percent chance (Duke, 07.11.2000)
&& pWeapon->type !=9) // but not for spellbooks (Duke, 09/10/00)
{
pWeapon->hp--; //Take off a hit point
if(pWeapon->hp<=0)
{
sysmessage(s1, tr("Your weapon has been destroyed"));
if ((pWeapon->trigon==1) && (pWeapon->layer>0))// -Frazurbluu- Trigger Type 2 is my new trigger type *-
{
Trig->triggerwitem(s1, pWeapon, 1); // trigger is fired when item destroyed
}
Items->DeleItem(pWeapon);
}
}
// End here - Magius(CHE) - For armour absorbtion system
pc_attacker->swingtarg=-1;
if((chardist(pc_attacker, pc_deffender)>1 && fightskill!=ARCHERY) || !los) return;
if(pc_deffender->isNpc() && pc_deffender->isInvul()) return; // ripper
hit=Skills->CheckSkill(pc_attacker, fightskill, 0, 1000); // increase fighting skill for attacker and defender
if (!hit)
{
if (pc_attacker->isPlayer())
doMissedSoundEffect(pc_attacker);
if ((fightskill==ARCHERY)&&(los))
{
if (rand()%3-1)//-1 0 or 1
{
short id=0x1BFB; // bolts
if (bowtype==1)
id=0x0F3F; // arrows
P_ITEM pAmmo=Items->SpawnItem(pc_deffender,1,"#",1,id,0,0);
if(pAmmo)
{
pAmmo->moveTo(pc_deffender->pos);
pAmmo->priv=1;
RefreshItem(pAmmo);
}
}
}
}
else
{
if (!pc_deffender->isInvul())
{
if (pc_deffender->xid==0x0191) soundeffect2(pc_deffender,0x014b);
else if (pc_deffender->xid==0x0190) soundeffect2(pc_deffender,0x0156);
playmonstersound(pc_deffender, pc_deffender->id(), SND_DEFEND);
//AntiChrist -- for poisoned weapons
if((pWeapon) && (pWeapon->poisoned>0))
{
pc_deffender->poisoned=pWeapon->poisoned;
pc_deffender->poisontime=uiCurrentTime+(MY_CLOCKS_PER_SEC*(40/pc_deffender->poisoned)); // a lev.1 poison takes effect after 40 secs, a deadly pois.(lev.4) takes 40/4 secs - AntiChrist
pc_deffender->poisonwearofftime=pc_deffender->poisontime+(MY_CLOCKS_PER_SEC*SrvParams->poisonTimer()); //wear off starts after poison takes effect - AntiChrist
}
CheckPoisoning(s2, pc_attacker, pc_deffender); // attacker poisons defender
CheckPoisoning(s1, pc_deffender, pc_attacker); // and vice versa
if ((pc_deffender->effDex()>0)) pc_deffender->priv2&=0xFD; // unfreeze
if (fightskill!=WRESTLING && los)
Combat->ItemSpell(pc_attacker, pc_deffender);
if (fightskill!=WRESTLING || pc_attacker->isNpc())
basedamage=Combat->CalcAtt(pc_attacker); // Calc base damage
else
{
if ((pc_attacker->skill[WRESTLING]/100) > 0)
{
if (pc_attacker->skill[WRESTLING]/100!=0)
basedamage=rand()%(pc_attacker->skill[WRESTLING]/100);
else basedamage=0;
}
else basedamage=rand()%2;
//.........这里部分代码省略.........
示例4: CombatOnHorse
//play animation for weapon in hand during combat on a horse //kolours - modularized (09/20/98)
void cCombat::CombatOnHorse(P_CHAR pc)
{
if ( pc == NULL ) return;
P_ITEM pWeapon=pc->getWeapon();
// tweak for better fight animations if on Lama, ostards, kirin, seahorse, or ridgeback
// LB (04-02-2002)
P_ITEM pHorseItem=pc->GetItemOnLayer(0x19);
int base;
switch(pHorseItem->id2)
{
case 0xab: // llamas
case 0xa6:
base=0x2b;
break;
case 0xa3: // ostards
case 0xa4:
case 0xa5:
case 0xac:
base=0x35;
break;
case 0xad: // kirin
base=0x3f;
break;
case 0xb3: // sea horse
base=0x49;
break;
case 0xb8: //ridgeback
base=0x53;
break;
default:
base = 0x17; // default (horse) base animation
break;
}
if (pWeapon)
{
short id = pWeapon->id();
if (IsBow(id))
{
npcaction(pc, 0x1B);
return;
}
if (IsCrossbow(id) || IsHeavyCrossbow(id))
{
npcaction(pc, 0x1C);
return;
}
if( IsSword(id) || IsMaceType(id) ||
(id ==0x0FB4 || id ==0x0FB5) || // sledge hammer
IsFencing1H(id) )
{
npcaction(pc, 0x1A);
return;
}
if ( IsAxe(id) || IsFencing2H(id) )
{
npcaction(pc, 0x1D); //2Handed
return;
}
} // end of !=-1
else
{
npcaction(pc, 0x1A); //fist fighting
return;
}
}