Raycaster

Untitled

Mar 2nd, 2021
825
132 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package com.planet_ink.coffee_mud.Abilities.Properties;
  2. import com.planet_ink.coffee_mud.core.interfaces.*;
  3. import com.planet_ink.coffee_mud.core.*;
  4. import com.planet_ink.coffee_mud.core.collections.*;
  5. import com.planet_ink.coffee_mud.Abilities.interfaces.*;
  6. import com.planet_ink.coffee_mud.Areas.interfaces.*;
  7. import com.planet_ink.coffee_mud.Behaviors.interfaces.*;
  8. import com.planet_ink.coffee_mud.CharClasses.interfaces.*;
  9. import com.planet_ink.coffee_mud.Commands.interfaces.*;
  10. import com.planet_ink.coffee_mud.Common.interfaces.*;
  11. import com.planet_ink.coffee_mud.Exits.interfaces.*;
  12. import com.planet_ink.coffee_mud.Items.interfaces.*;
  13. import com.planet_ink.coffee_mud.Libraries.interfaces.*;
  14. import com.planet_ink.coffee_mud.Locales.interfaces.*;
  15. import com.planet_ink.coffee_mud.MOBS.interfaces.*;
  16. import com.planet_ink.coffee_mud.Races.interfaces.*;
  17.  
  18. import java.util.*;
  19.  
  20. /*
  21.    Copyright 2003-2021 Bo Zimmerman
  22.  
  23.    Licensed under the Apache License, Version 2.0 (the "License");
  24.    you may not use this file except in compliance with the License.
  25.    You may obtain a copy of the License at
  26.  
  27.        http://www.apache.org/licenses/LICENSE-2.0
  28.  
  29.    Unless required by applicable law or agreed to in writing, software
  30.    distributed under the License is distributed on an "AS IS" BASIS,
  31.    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  32.    See the License for the specific language governing permissions and
  33.    limitations under the License.
  34. */
  35. public class Prop_Doppleganger extends Property
  36. {
  37.     @Override
  38.     public String ID()
  39.     {
  40.         return "Prop_Doppleganger";
  41.     }
  42.  
  43.     @Override
  44.     public String name()
  45.     {
  46.         return "Doppleganger";
  47.     }
  48.  
  49.     @Override
  50.     protected int canAffectCode()
  51.     {
  52.         return Ability.CAN_MOBS|Ability.CAN_ITEMS;
  53.     }
  54.     //protected boolean lastLevelChangers=true;
  55.     protected Physical  lastOwner                   = null;
  56.     private int         maxLevel                    = Integer.MAX_VALUE;
  57.     private int         minLevel                    = Integer.MIN_VALUE;
  58.     protected int       lastLevel                   = Integer.MIN_VALUE;
  59.     protected int       levelAdd                    = 0;
  60.     protected double    levelPct                    = 1.0;
  61.     protected int       diffAdd                     = 0;
  62.     protected double    diffPct                     = 1.0;
  63.     protected boolean   matchPlayersOnly            = false;
  64.     protected boolean   matchPlayersFollowersOnly   = false;
  65.     protected int       asMaterial                  = -1;
  66.  
  67.     @Override
  68.     public long flags()
  69.     {
  70.         return Ability.FLAG_ADJUSTER;
  71.     }
  72.  
  73.     @Override
  74.     public String accountForYourself()
  75.     {
  76.         return "Level Changer";
  77.     }
  78.  
  79.     @Override
  80.     public void setMiscText(final String text)
  81.     {
  82.         super.setMiscText(text);
  83.         levelAdd=0;
  84.         diffAdd=0;
  85.         levelPct=1.0;
  86.         diffPct=1.0;
  87.         asMaterial=-1;
  88.         maxLevel=Integer.MAX_VALUE;
  89.         minLevel=Integer.MIN_VALUE;
  90.         if(CMath.isInteger(text))
  91.             levelAdd=CMath.s_int(text);
  92.         else
  93.         if(CMath.isPct(text))
  94.             levelPct=CMath.s_pct(text);
  95.         else
  96.         {
  97.             maxLevel=CMParms.getParmInt(text,"MAX",Integer.MAX_VALUE);
  98.             minLevel=CMParms.getParmInt(text,"MIN",Integer.MIN_VALUE);
  99.             levelAdd=CMParms.getParmInt(text, "LEVELADD", 0);
  100.             levelPct=CMParms.getParmInt(text, "LEVELPCT", 100)/100.0;
  101.             diffAdd=CMParms.getParmInt(text, "DIFFLADD", 0);
  102.             diffPct=CMParms.getParmInt(text, "DIFFPCT", 100)/100.0;
  103.             matchPlayersFollowersOnly=CMParms.getParmBool(text, "PLAYERSNFOLS", false);
  104.             matchPlayersOnly=CMParms.getParmBool(text, "PLAYERSONLY", false);
  105.             final String asMat = CMParms.getParmStr(text, "ASMATERIAL", "");
  106.             if((asMat!=null)&&(asMat.trim().length()>0))
  107.                 asMaterial = RawMaterial.CODES.FIND_IgnoreCase(asMat);
  108.         }
  109.     }
  110.  
  111.     protected void doppleGangItem(final Item I)
  112.     {
  113.         final ItemPossessor owner=I.owner();
  114.         if(owner!=null)
  115.         {
  116.             lastOwner=owner;
  117.             lastLevel=owner.phyStats().level();
  118.             int level=(int)Math.round(CMath.mul(((MOB)owner).phyStats().level(),levelPct))+levelAdd;
  119.             if(level<minLevel)
  120.                 level=minLevel;
  121.             if(level>maxLevel)
  122.                 level=maxLevel;
  123.             int difflevel=(int)Math.round(CMath.mul(level,diffPct))+diffAdd;
  124.             I.basePhyStats().setLevel(difflevel);
  125.             I.phyStats().setLevel(difflevel);
  126.             final int oldMaterial=I.material();
  127.             if(asMaterial != -1)
  128.                 I.setMaterial(asMaterial);
  129.             CMLib.itemBuilder().balanceItemByLevel(I);
  130.             I.basePhyStats().setLevel(level);
  131.             I.phyStats().setLevel(level);
  132.             I.setMaterial(oldMaterial);
  133.             level=((MOB)owner).phyStats().level();
  134.             if(level<minLevel)
  135.                 level=minLevel;
  136.             if(level>maxLevel)
  137.                 level=maxLevel;
  138.             I.basePhyStats().setLevel(level);
  139.             I.phyStats().setLevel(level);
  140.             owner.recoverPhyStats();
  141.             if(owner instanceof Room)
  142.                 ((Room)owner).recoverRoomStats();
  143.             else
  144.             if(owner instanceof MOB)
  145.             {
  146.                 final MOB M=(MOB)owner;
  147.                 M.recoverCharStats();
  148.                 M.recoverMaxState();
  149.                 M.recoverPhyStats();
  150.             }
  151.         }
  152.     }
  153.    
  154.     @Override
  155.     public void executeMsg(final Environmental myHost, final CMMsg msg)
  156.     {
  157.         if((affected instanceof Item)
  158.         &&((((Item)affected).owner()!=lastOwner)||((lastOwner!=null)&&(lastOwner.phyStats().level()!=lastLevel)))
  159.         &&(((Item)affected).owner() instanceof MOB))
  160.             doppleGangItem((Item)affected);
  161.         super.executeMsg(myHost,msg);
  162.     }
  163.  
  164.     protected void doppleGangMob(final MOB entrantM, final MOB mob, final Room R)
  165.     {
  166.         if((R!=null)
  167.         &&(CMLib.flags().isAliveAwakeMobile(mob,true))
  168.         &&(mob.curState().getHitPoints()>=mob.maxState().getHitPoints()))
  169.         {
  170.             int total=0;
  171.             int num=0;
  172.             final MOB victim=mob.getVictim();
  173.             if(canMimic(victim,R))
  174.             {
  175.                 total+=victim.phyStats().level();
  176.                 num++;
  177.             }
  178.             if(canMimic(entrantM,R))
  179.             {
  180.                 total+=entrantM.phyStats().level();
  181.                 num++;
  182.             }
  183.             for(int i=0;i<R.numInhabitants();i++)
  184.             {
  185.                 final MOB M=R.fetchInhabitant(i);
  186.                 if((M!=null)
  187.                 &&(M!=mob)
  188.                 &&((M.getVictim()==mob)||(victim==null))
  189.                 &&((M!=victim)&&(M!=entrantM))
  190.                 &&(canMimic(M,R)))
  191.                 {
  192.                     total+=M.phyStats().level();
  193.                     num++;
  194.                 }
  195.             }
  196.             if(num>0)
  197.             {
  198.                 int level=(int)Math.round(CMath.mul(CMath.div(total,num),levelPct))+levelAdd;
  199.                 if(level<minLevel)
  200.                     level=minLevel;
  201.                 if(level>maxLevel)
  202.                     level=maxLevel;
  203.                 int difflevel=(int)Math.round(CMath.mul(level,diffPct))+diffAdd;
  204.                 if(level!=mob.basePhyStats().level())
  205.                 {
  206.                     mob.basePhyStats().setLevel(difflevel);
  207.                     mob.phyStats().setLevel(difflevel);
  208.                     mob.basePhyStats().setArmor(CMLib.leveler().getLevelMOBArmor(mob));
  209.                     mob.basePhyStats().setAttackAdjustment(CMLib.leveler().getLevelAttack(mob));
  210.                     mob.basePhyStats().setDamage(CMLib.leveler().getLevelMOBDamage(mob));
  211.                     mob.basePhyStats().setSpeed(1.0+(CMath.div(level,100)*4.0));
  212.                     mob.baseState().setHitPoints(CMLib.leveler().getPlayerHitPoints(mob));
  213.                     mob.baseState().setMana(CMLib.leveler().getLevelMana(mob));
  214.                     mob.baseState().setMovement(CMLib.leveler().getLevelMove(mob));
  215.                     mob.basePhyStats().setLevel(level);
  216.                     mob.phyStats().setLevel(level);
  217.                     mob.recoverPhyStats();
  218.                     mob.recoverCharStats();
  219.                     mob.recoverMaxState();
  220.                     mob.resetToMaxState();
  221.                 }
  222.             }
  223.         }
  224.     }
  225.    
  226.     public boolean canMimic(final MOB mob, final Room R)
  227.     {
  228.         if((mob==affected)
  229.         ||(mob==null))
  230.             return false;
  231.         if((affected instanceof Room)
  232.         &&(mob.isMonster())
  233.         &&(mob.getStartRoom()!=null)
  234.         &&(mob.getStartRoom().getArea()==((Room)affected).getArea()))
  235.             return false;
  236.         if((affected instanceof Area)
  237.         &&(mob.isMonster())
  238.         &&(mob.getStartRoom()!=null)
  239.         &&(mob.getStartRoom().getArea()==(Area)affected))
  240.             return false;
  241.         if(mob.fetchEffect(ID())!=null)
  242.             return false;
  243.         if(mob.isMonster())
  244.         {
  245.             if(matchPlayersFollowersOnly)
  246.             {
  247.                 final MOB folM=mob.amUltimatelyFollowing();
  248.                 return (folM!=null)&& (!folM.isMonster());
  249.             }
  250.             return (!matchPlayersOnly);
  251.         }
  252.  
  253.         if((!CMSecurity.isAllowed(mob,R,CMSecurity.SecFlag.CMDMOBS))
  254.         &&(!CMSecurity.isAllowed(mob,R,CMSecurity.SecFlag.CMDROOMS))
  255.         &&(!CMLib.flags().isUnattackable(mob)))
  256.             return true;
  257.         return false;
  258.     }
  259.  
  260.     @Override
  261.     public boolean okMessage(final Environmental myHost, final CMMsg msg)
  262.     {
  263.         if((((msg.target() instanceof Room)&&(msg.sourceMinor()==CMMsg.TYP_ENTER))
  264.            ||(msg.sourceMinor()==CMMsg.TYP_LIFE))
  265.         &&(!(affected instanceof Item)))
  266.         //&&(lastLevelChangers))
  267.         {
  268.             //lastLevelChangers=false;
  269.             if(affected instanceof MOB)
  270.             {
  271.                 final Room R=(msg.target() instanceof Room)?((Room)msg.target()):msg.source().location();
  272.                 this.doppleGangMob(msg.source(), (MOB)affected, R);
  273.             }
  274.             else
  275.             if(affected instanceof Room)
  276.             {
  277.                 final Room R=(Room)affected;
  278.                 for(final Enumeration<MOB> m=R.inhabitants();m.hasMoreElements();)
  279.                 {
  280.                     final MOB M=m.nextElement();
  281.                     if((M.isMonster())
  282.                     &&(M.getStartRoom()!=null)
  283.                     &&(M.amFollowing()==null)
  284.                     &&(M.getStartRoom().getArea()==R.getArea()))
  285.                         this.doppleGangMob(msg.source(), M, R);
  286.                 }
  287.             }
  288.             else
  289.             if(affected instanceof Area)
  290.             {
  291.                 final Room R=(msg.target() instanceof Room)?((Room)msg.target()):msg.source().location();
  292.                 for(final Enumeration<MOB> m=R.inhabitants();m.hasMoreElements();)
  293.                 {
  294.                     final MOB M=m.nextElement();
  295.                     if((M.isMonster())
  296.                     &&(M.getStartRoom()!=null)
  297.                     &&(M.amFollowing()==null)
  298.                     &&(M.getStartRoom().getArea()==affected))
  299.                         this.doppleGangMob(msg.source(), M, R);
  300.                 }
  301.             }
  302.         }
  303.         return super.okMessage(myHost,msg);
  304.     }
  305. }
  306.  
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×