PenUltima Online

It is currently Fri Oct 10, 2008 11:05 am

All times are UTC - 8 hours




Post new topic Reply to topic  [ 7 posts ] 
Author Message
 Post subject: Casting with staffs...
PostPosted: Fri Aug 18, 2006 7:59 am 
Offline

Joined: Fri Apr 14, 2006 9:36 am
Posts: 240
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?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Aug 18, 2006 1:33 pm 
Offline

Joined: Thu Feb 02, 2006 1:41 pm
Posts: 1154
Location: Southern Central USA
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.

_________________
Sincerely,
Yukiko

I know you think you understand what you thought I said but what you heard is not exactly what I meant.

Titus 2:13


Top
 Profile  
 
 Post subject:
PostPosted: Sat Aug 19, 2006 7:18 am 
Offline

Joined: Fri Apr 14, 2006 9:36 am
Posts: 240
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.


Top
 Profile  
 
 Post subject:
PostPosted: Mon Aug 21, 2006 7:41 pm 
Offline

Joined: Thu Feb 02, 2006 1:41 pm
Posts: 1154
Location: Southern Central USA
I assume you recompiled all the scripts after changing the can_cast function call?

_________________
Sincerely,
Yukiko

I know you think you understand what you thought I said but what you heard is not exactly what I meant.

Titus 2:13


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 22, 2006 7:16 am 
Offline

Joined: Fri Apr 14, 2006 9:36 am
Posts: 240
Yes, and .unloadall
I can recall with staffs but thats it


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 22, 2006 9:38 am 
Offline
User avatar

Joined: Sat Feb 04, 2006 8:17 am
Posts: 146
Location: Illinois, USA
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.

_________________
2nd place is the 1st loser.


Top
 Profile  
 
 Post subject:
PostPosted: Tue Aug 22, 2006 10:52 am 
Offline

Joined: Fri Apr 14, 2006 9:36 am
Posts: 240
I tried with the bvlock cast set to 1, 0 and deleting the line.. :/


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 7 posts ] 

All times are UTC - 8 hours


Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Style based on FI Subice by phpBBservice.nl