PenUltima Online Forum Index Official Core: 096.7
Official Core: 097 2008-02-26
Donate towards the POL web hosting bill!
 POL Home   FAQ   Search    Memberlist   Usergroups    Register    Profile   Log in to check your private messages   Log in
Casting with staffs...

 
Post new topic   Reply to topic    PenUltima Online Forum Index -> General Help (095)
Display posts from previous:   

Author Message
Poi



Joined: 14 Apr 2006
Posts: 203

PostPosted: Fri Aug 18, 2006 11:59 am    Post subject: Casting with staffs... Reply with quote

Hey how do you set it so mages can cast spells with staffs in thier hand? I checked out pkg>systems>combat>itemdesk and added "blockcastingwhileinhand 0" (or whatever its called) to all the staffs, and it didnt work, so i tried 1, it didnt work, and ive tried without the lkine.. didnt work, any ideas?

Author Message
Yukiko



Joined: 02 Feb 2006
Posts: 1094
Location: Southern Central USA

PostPosted: Fri Aug 18, 2006 5:33 pm    Post subject: Reply with quote

Look at spellRestrictions.inc in \pol\scripts\include

Look for this function:

Code:

function can_cast(who)
  var hand1 := (GetEquipmentByLayer(who, 1));
  var hand2 := (GetEquipmentByLayer(who, 2));
  if(hand1)
    if(hand1.graphic != 0x0efa)
      SendSysMessage(who,"You can't cast spells with things in your hands.", 3, 40);
      return 0;
    endif
  endif
  if(hand2)
    if(hand2.graphic != 0x0efa)
      SendSysMessage(who,"You can't cast spells with things in your hands.", 3, 40);
      return 0;
    endif
  endif
  return 1;
endfunction


The way I made casting with staves in hand was just to insert a return 1; after the function definition. So basically the function does nothing but return with a "yes" value. To be more proper you can search the entire file for all calls to can_cast and comment them out. But I cheated.

Author Message
Poi



Joined: 14 Apr 2006
Posts: 203

PostPosted: Sat Aug 19, 2006 11:18 am    Post subject: Reply with quote

I don't understand, and this is making me very angry.

Code:
use uo;
use os;
use cfgfile;
use util;

include "include/fields";
include "include/attributes";
include "include/client";
include "include/objtype";
include "include/statMod";
include "include/firewall";
include "include/spellAttack";
include "include/dist";

var caster;
var npccfg := ReadConfigFile("::npcdesc");
const EVID_DISCHARGE := 0x123457;

function maincast(parms, delivery, circle, noto, id);
  var cast_on;
  var spellscroll := 0;
  var scroll;
  var tgtopt;
  if(parms[1] == "#MOB")
    caster := parms[2];
    if(mobspellcast(caster, circle, spellscroll) == 0)
      return 0;
    endif
    cast_on := parms[3];
  elseif (parms[1] == "#scroll")
    spellscroll := 1;
    caster := parms[2];
    EraseObjProperty(caster, "IsMeditating");
    EraseObjProperty(caster, "HealTimer");
    if(spellcast(caster, circle, spellscroll, id) == 0)
      return 0;
    endif
    scroll := parms[3];
    if(!ReserveItem(scroll))
      SendSysMessage(caster,"You lost your concentration.", 3, 40);
      return 0;
    endif
    if(delivery == "notarget")
      cast_on := caster;
      if(!can_cast(caster))
        cast_on := 0;
      endif
    elseif(delivery == "direct")
      if(noto == "helpful")
        cast_on := CanTargetSpell(caster, circle, TGTOPT_HELPFUL + TGTOPT_CHECK_LOS);
        if(!can_cast(caster))
          cast_on := 0;
        endif
      elseif(noto == "neutral")
        cast_on := CanTargetSpell(caster, circle, TGTOPT_CHECK_LOS);
        if(!can_cast(caster))
          cast_on := 0;
        endif
      else
        cast_on := CanTargetSpell(caster, circle, TGTOPT_HARMFUL + TGTOPT_CHECK_LOS);
        if(!can_cast(caster))
          cast_on := 0;
        endif
      endif
      if(!cast_on)
        return 0;
      endif
    elseif(delivery == "indirect")
      cast_on := CanTargetArea(caster, circle);
      if(!can_cast(caster))
        cast_on := 0;
      endif
      if (!cast_on)
        return 0;
      endif
    else
      return 0;
    endif
  else
    caster := parms;
    EraseObjProperty(caster, "IsMeditating");
    EraseObjProperty(caster, "HealTimer");
    if (spellcast(caster, circle, spellscroll, id) == 0)
      return 0;
    endif
////////////////////////////////////////////
// if (!ConsumeReagents(caster, id+100))
// SendSysMessage(caster, "You do not have the proper reagents.");
// return 0;
// endif
////////////////////////////////////////////
    if(delivery == "notarget")
      cast_on := caster;
      if(!can_cast(caster))
        cast_on := 0;
      endif
    elseif(delivery == "direct")
      if(noto == "helpful")
        cast_on := CanTargetSpell(caster, circle, TGTOPT_HELPFUL + TGTOPT_CHECK_LOS);
        if(!can_cast(caster))
          cast_on := 0;
        endif
      elseif(noto == "neutral")
        cast_on := CanTargetSpell(caster, circle, TGTOPT_CHECK_LOS);
        if(!can_cast(caster))
          cast_on := 0;
        endif
      else
        cast_on := CanTargetSpell(caster, circle, TGTOPT_HARMFUL + TGTOPT_CHECK_LOS);
        if(!can_cast(caster))
          cast_on := 0;
        endif
      endif
      if (!cast_on)
        return 0;
      endif
    elseif(delivery == "indirect")
      cast_on := CanTargetArea(caster, circle);
      if(!can_cast(caster))
        cast_on := 0;
      endif
      if (!cast_on)
        return 0;
      endif
    else
      return 0;
    endif
  endif
  if(newusemana(caster, circle, cast_on, delivery) == 0)
    PlaySoundEffect(caster,0x005d);
    PlayObjectCenteredEffect(caster, 0x3735,0x0a, 0x1e);
    return 0;
  endif
  if(spellscroll == 1)
    if(!SubtractAmount(scroll, 1))
      return 0;
    endif
  endif
  var points := getpoints(circle, spellscroll, SKILLID_MAGERY);
  AwardRawSkillPoints(caster, SKILLID_MAGERY, points);
  var newparms := {};
  newparms[1] := caster;
  newparms[2] := cast_on;
  return newparms;
endfunction

function can_cast(who)
  var hand1 := (GetEquipmentByLayer(who, 1));
  var hand2 := (GetEquipmentByLayer(who, 2));
  if(hand1)
    if(hand1.graphic != 0x0efa)
      return 1;
    endif
  endif
  if(hand2)
    if(hand2.graphic != 0x0efa)
      return 1;
    endif
  endif
  return 1;
endfunction

function CanTargetSpell(caster, circle, targopt := TGTOPT_CHECK_LOS)
  if(!can_cast(caster))
    return 0;
  endif
  var cast_on := Target(caster, targopt);
  if(!cast_on)
    return 0;
  endif
  if(cast_on.hidden)
    SendSysMessage(caster,"You can't see that.", 3, 40);
    return 0;
  endif
  if(dist(caster, cast_on) >= 12)
    SendSysMessage(caster, "That is too far away.", 3, 40);
    return 0;
  endif
  return cast_on;
endfunction

function CanTargetArea(caster, circle)
  if (!can_cast(caster))
    return 0;
  endif
  var cast_loc := TargetCoordinates(caster);
  if (!cast_loc.x)
    return 0;
  endif
  if (!CheckLosAt(caster, cast_loc.x, cast_loc.y, cast_loc.z))
    SendSysMessage(caster, "You can't see that.", 3, 40);
    return 0;
  endif
  if(coordist(caster.x, caster.y, cast_loc.x, cast_loc.y) >= 12)
    SendSysMessage(caster, "That is too far away.", 3, 40);
    return 0;
  endif
  return cast_loc;
endfunction

function Reflected(cast_on)
  var mr := CInt(GetObjProperty(cast_on, "mr"));
  if(mr >= 1)
    PlaySoundEffect(cast_on, SFX_SPELL_MAGIC_REFLECTION);
    PlayObjectCenteredEffect(cast_on, FX_CURSE_EFFECT, 10,10);
    SendSysMessage(cast_on, "Your magic reflect spell saved you!");
    if(mr == 1)
      EraseObjProperty(cast_on, "mr");
    elseif(mr == 2)
      var holder, pid;
      var eqp := GetObjProperty(cast_on, "EquipTimers");
      foreach thing in ListEquippedItems(cast_on)
        foreach entry in eqp
          if((thing.serial == entry[1]) and (entry[2] == "ref"))
            holder := GetObjProperty(thing, "pid");
            break;
          endif
        endforeach
      endforeach
      pid := getprocess(holder);
      if(pid)
        var k := struct;
        k.+type := EVID_DISCHARGE;
        pid.sendevent(k);
      else
        EraseObjProperty(cast_on, "mr");
      endif
    endif
    return 1;
  endif
  return 0;
endfunction

function Resisted(circle, caster, cast_on, amt)
   // Purpose: to check for resistance to spells cast upon a character
   // called by: most spells
   // returns: amount of damage not resisted?

        var magery := CInt(GetEffectiveSkill(caster, SKILLID_MAGERY));
        var evalint := CInt(GetEffectiveSkill(caster, SKILLID_EVALINT));
        var resist := CInt(GetEffectiveSkill(cast_on, SKILLID_MAGICRESISTANCE));
       
        // chk1 relates to the resist ability.
        var chk1 := (resist / 5);
        // chk2 relates to the difficulty level
        var chk2 := resist - (((magery - 20) / 5) + (circle * 5));
       
        if(chk1 < 1)
                chk1 := 1;
        endif
        if(chk2 < 1)
                chk2 := 1;
        endif
       
        // What an odd construct. 
        // If you're hit with an easy spell then you have a difficulty of your resist
        var diff := 0;
        if(chk1 > chk2)
                diff := chk1;
        else
                diff := chk2;
        endif
       
        var points := getresistpoints(circle, cast_on, SKILLID_MAGICRESISTANCE);
        if(cast_on.dead)
                return 0;
        endif
        if(CheckSkill(cast_on, SKILLID_MAGICRESISTANCE, diff, points))
                SendSysMessage(cast_on, "You feel yourself resisting magical energy!");
                PlaySoundEffect(cast_on, SFX_SPELL_WEAKEN);
                PlayObjectCenteredEffect(cast_on, FX_CURSE_EFFECT, 5,5);
                amt := (amt * 0.5);
                if(amt < 1)
                        amt := 1;
                endif
        endif
        var modamt := 1;
        if(resist > evalint)
                modamt := (1 + ((evalint - resist) / 200.0));
        elseif(evalint > resist)
                modamt := (1 + ((evalint - resist) / 500.0));
        endif
        amt := (amt * modamt);
        return CInt(amt);
endfunction


function CalcSpellDamage(circle, caster, cast_on)
  var die_string := circle+"d8";
  var dmg := RandomDiceRoll(die_string);
  dmg := dmg + CInt(GetEffectiveSkill(caster, SKILLID_MAGERY)/10);
  if(dmg > (circle * 8))
    dmg := circle * 8;
  endif
  return dmg;
endfunction

function CanTargetThing(caster, circle, targopt := TGTOPT_CHECK_LOS)
  if (!can_cast(caster))
    return 0;
  endif
  var cast_on := Target(caster, targopt);
  if(!cast_on)
    return;
  endif
  return cast_on;
endfunction

function spellcast(me, circle, scroll, id)
  var spellcfg := ReadConfigFile(":spells:spells");
  var val := SplitWords(spellcfg[id].val);
  var times := CInt(val[1]);
  var slp   := CInt(val[2]);
  var mhp := GetHp(me);
  var umana, diff, points;
  var n := 1;
  if(scroll == 0)
    case (circle)
      1:   umana :=   4;     diff :=  10;
      2:   umana :=   6;     diff :=  20;
      3:   umana :=   9;     diff :=  30;
      4:   umana :=  11;     diff :=  50;
      5:   umana :=  14;     diff :=  60;
      6:   umana :=  20;     diff :=  70;
      7:   umana :=  40;     diff :=  85;
      8:   umana :=  50;     diff :=  95;
      9:   umana :=  75;     diff := 100;
     10:   umana := 100;     diff := 100;
    endcase
  elseif(scroll == 1)
    case (circle)
      1:   umana :=   4;     diff := 10;
      2:   umana :=   6;     diff := 10;
      3:   umana :=   9;     diff := 10;
      4:   umana :=  11;     diff := 20;
      5:   umana :=  14;     diff := 30;
      6:   umana :=  20;     diff := 50;
      7:   umana :=  40;     diff := 60;
      8:   umana :=  50;     diff := 70;
      9:   umana :=  75;     diff := 85;
     10:   umana := 100;     diff := 95;
    endcase
  else
    return 0;
  endif
  if((mhp > GetHp(me)) && ((RandomInt(99)+1) > (GetEffectiveSkill(me, SKILLID_WRESTLING)/2)))
    SendSysMessage(me,"You lost your concentration.", 3, 40);
    return 0;
  endif
  if (umana > GetMana(me))
    me.frozen :=1;
    PerformAction(me,ANIM_CAST_DIR);
    sleepms(1200);
    me.frozen :=0;
    SendSysMessage(me,"You do not have enough mana to cast that.", 3, 40);
    PlaySoundEffect(me,0x005d);
    PlayObjectCenteredEffect(me, 0x3735,0x0a, 0x1e);
    return 0;
  endif
  if(can_cast(me))
    me.frozen :=1;
    for (n:=1; n<=times; n:=n+1)
      if((mhp > GetHp(me)) && ((RandomInt(99)+1) > (GetEffectiveSkill(me, SKILLID_WRESTLING)/2)))
        SendSysMessage(me,"You lost your concentration.", 3, 40);
        PlaySoundEffect(me,0x005d);
        PlayObjectCenteredEffect(me, 0x3735,0x0a, 0x1e);
        me.frozen :=0;
        return 0;
      endif
      PerformAction(me,ANIM_CAST_DIR);
      sleepms(900);
    endfor
    if(slp)
      sleepms(slp * 100);
    endif
    me.frozen :=0;
    if (CheckSkill(me,SKILLID_MAGERY, diff, 0))
      if((mhp > GetHp(me)) && ((RandomInt(99)+1) > (GetEffectiveSkill(me, SKILLID_WRESTLING)/2)))
        SendSysMessage(me,"You lost your concentration.", 3, 40);
        return 0;
      endif
      return 1;
    else
      SendSysMessage(me,"The spell fizzles.", 3, 40);
      PlaySoundEffect(me,0x005d);
      PlayObjectCenteredEffect(me, 0x3735,0x0a, 0x1e);
      return 0;
    endif
  endif
endfunction

function newusemana(who, circle, cast_on, delivery)
  if(delivery == "direct")
    if(!CheckLineOfSight(who, cast_on))
      SendSysMessage(who, "You can't see that.", 3, 40);
      return 0;
    endif
  elseif(delivery == "indirect")
    if(!CheckLosAt(who, cast_on.x, cast_on.y, cast_on.z))
      SendSysMessage(who, "You can't see that.", 3, 40);
      return 0;
    endif
  endif
  if(cdist(who.x, who.y, cast_on.x, cast_on.y) > 12)
    var check := 0;
    foreach thing in EnumerateItemsInContainer(who.backpack)
      if(thing == cast_on)
        check := 1;
        break;
      endif
    endforeach
    if(!check)
      SendSysMessage(who,"The target is out of range.", 3, 40);
      return 0;
    endif
  endif
  var umana;
    case (circle)
    1: umana :=  4;
    2: umana :=  6;
    3: umana :=  9;
    4: umana := 11;
    5: umana := 14;
    6: umana := 20;
    7: umana := 40;
    8: umana := 50;
  endcase
  var mana := GetMana(who);
  if(mana >= umana)
    SetMana(who, Cint(mana - umana));
    return 1;
  else
    SendSysMessage(who,"You do not have enough mana to cast that.", 3, 40);
    return 0;
  endif
endfunction

function mobspellcast(me, circle, scroll)
  var diff, points, umana;
  case(circle)
    1:   diff := 10;     points :=  20;    umana :=   4;
    2:   diff := 20;     points :=  40;    umana :=   6;
    3:   diff := 30;     points :=  80;    umana :=   9;
    4:   diff := 50;     points := 100;    umana :=  11;
    5:   diff := 60;     points := 130;    umana :=  14;
    6:   diff := 70;     points := 160;    umana :=  20;
    7:   diff := 85;     points := 190;    umana :=  40;
    8:   diff := 95;     points := 210;    umana :=  50;
  endcase
  if(umana > GetMana(me))
    return 0;
  endif
  if(can_cast(me))
    if(CheckSkill(me, SKILLID_MAGERY, (diff - 10), points))
      return 1;
    else
      return 0;
    endif
  endif
endfunction

function getpoints(c, scroll, skillid)
  var points;
  var diff;
  if(scroll == 1)
    case(c)
      1:   points :=  10; diff :=  0;
      2:   points :=  20; diff := 10;
      3:   points :=  20; diff := 10;
      4:   points :=  40; diff := 20;
      5:   points :=  60; diff := 30;
      6:   points := 100; diff := 50;
      7:   points := 120; diff := 60;
      8:   points := 140; diff := 70;
    endcase
  else
    case(c)
      1:   points :=  20; diff := 20;
      2:   points :=  40; diff := 30;
      3:   points :=  80; diff := 40;
      4:   points := 100; diff := 50;
      5:   points := 120; diff := 60;
      6:   points := 140; diff := 70;
      7:   points := 160; diff := 86;
      8:   points := 180; diff := 100;
    endcase
  endif
  var skill := GetEffectiveSkill(caster, skillid);
  if(skill > (diff - 20))
    if((skill - diff) <= 5)
      points := points;
    elseif((skill - diff) <= 10)
      points := (points * 3) / 4;
    elseif((skill - diff) <= 15)
      points := points / 2;
    elseif((skill - diff) <= 15)
      points := points / 4;
    else
      points := 0;
    endif
  endif
  return points;
endfunction

function getresistpoints(c, victim, skillid)
  var points;
  var diff;
  case(c)
    1:   points :=  20; diff := 20;
    2:   points :=  40; diff := 30;
    3:   points :=  80; diff := 40;
    4:   points := 100; diff := 50;
    5:   points := 120; diff := 60;
    6:   points := 140; diff := 70;
    7:   points := 160; diff := 86;
    8:   points := 180; diff := 100;
  endcase
  var skill := GetEffectiveSkill(victim, skillid);
  if(skill > (diff - 20))
    if((skill - diff) <= 5)
      points := points;
    elseif((skill - diff) <= 10)
      points := (points * 3) / 4;
    elseif((skill - diff) <= 15)
      points := points / 2;
    elseif((skill - diff) <= 15)
      points := points / 4;
    else
      points := 0;
    endif
  endif
  return points;
endfunction

function cdist(x1, y1, x2, y2)
  var xd := x1 - x2;
  var yd := y1 - y2;
  if (xd < 0)
    xd := -xd;
  endif
  if (yd < 0)
    yd := -yd;
  endif
  if (xd > yd)
    return xd;
  else
    return yd;
  endif
endfunction

function usemana(who, circle, cast_on)
  if(cast_on.mobile)
    if(!CheckLineOfSight(who, cast_on))
      SendSysMessage(who, "You can't see that.", 3, 40);
      return 0;
    endif
  else
    if(!CheckLosAt(who, cast_on.x, cast_on.y, cast_on.z))
      SendSysMessage(who, "You can't see that.", 3, 40);
      return 0;
    endif
  endif
  if(cdist(who.x, who.y, cast_on.x, cast_on.y) > 12)
    SendSysMessage(who,"The target is out of range.", 3, 40);
    return 0;
  endif
  var umana;
  case (circle)
    1: umana :=   4;
    2: umana :=   6;
    3: umana :=   9;
    4: umana :=  11;
    5: umana :=  14;
    6: umana :=  20;
    7: umana :=  40;
    8: umana :=  50;
    9: umana :=  75;
   10: umana := 100;
  endcase
  var mana := GetMana(who);
  if(mana >= umana)
    var ms := SetMana(who, Cint(mana - umana));
    return 1;
  else
    SendSysMessage(who,"You do not have enough mana to cast that.", 3, 40);
    return 0;
  endif
endfunction




I edited the can_cast to what i thought would work. But nope.

Author Message
Yukiko



Joined: 02 Feb 2006
Posts: 1094
Location: Southern Central USA

PostPosted: Mon Aug 21, 2006 11:41 pm    Post subject: Reply with quote

I assume you recompiled all the scripts after changing the can_cast function call?

Author Message
Poi



Joined: 14 Apr 2006
Posts: 203

PostPosted: Tue Aug 22, 2006 11:16 am    Post subject: Reply with quote

Yes, and .unloadall
I can recall with staffs but thats it

Author Message
Tritan



Joined: 04 Feb 2006
Posts: 136
Location: Illinois, USA

PostPosted: Tue Aug 22, 2006 1:38 pm    Post subject: Reply with quote

Does your staff have the blockcircle property on it? I am sure you looked at this but it something I had to fight with in the past.

Author Message
Poi



Joined: 14 Apr 2006
Posts: 203

PostPosted: Tue Aug 22, 2006 2:52 pm    Post subject: Reply with quote

I tried with the bvlock cast set to 1, 0 and deleting the line.. :/

Post new topic   Reply to topic    PenUltima Online Forum Index -> General Help (095) All times are GMT - 4 Hours
Page 1 of 1

 




Powered by phpBB © 2001, 2005 phpBB Group :: Theme & Graphics by GHS & Scott E. Royalty