Показать сообщение отдельно
Старый 09.02.2010, 16:30   #291
ZloyPetrushkO
Местный
 
Регистрация: 31.05.2008
Сообщений: 1,159
По умолчанию

тэкс, посмарел цепочку.
в общем бомба летит летит летит и встречаеться с землей. происходят всякие перетурьации, и запускаеться вот что

Код:
protected void doExplosion(Actor actor, String s, Point3d point3d) {
/* 250*/        Class class1 = getClass();
/* 251*/        float f = Property.floatValue(class1, "power", 1000F);
/* 252*/        int i = Property.intValue(class1, "powerType", 0);
/* 253*/        float f1 = Property.floatValue(class1, "radius", 150F);
/* 254*/        MsgExplosion.send(actor, s, point3d, getOwner(), M, f, i, f1);
/* 256*/        ActorCrater.initOwner = getOwner();
/* 257*/        Explosions.generate(actor, point3d, f, i, f1);
/* 258*/        ActorCrater.initOwner = null;
/* 260*/        destroy();
            }
explosions generate отвечает за визуальные эффекты, нам мало интересно

нас интересует

MsgExplosion.send

вот он:
Код:
{
00024         explosion.chunkName = s;
00025         explosion.p.set(point3d);
00026         explosion.radius = f2;
00027         explosion.initiator = actor1;
00028         explosion.power = f1;
00029         explosion.powerType = i;
00030         if(i == 1)
00031             explosion.computeSplinterParams(f);
00032         if(!Actor.isValid(actor1) && Mission.isSingle() && (Mission.cur().netObj() == null || Mission.cur().netObj().isMaster()))
00033             explosion.initiator = actor1 = Engine.actorLand();
00034         if(!Actor.isValid(actor1))
00035             return;
00036         if(actor1.isNet() && actor1.net.isMirror())
00037             return;
00038         if(Actor.isValid(actor))
00039         {
00040             msg.setListener(actor);
00041             msg.send();
00042         }
00043         if(f2 <= 0.0F)
00044             return;
00045         Engine.collideEnv().getSphere(lst, point3d, f2);
00046         int j = lst.size();
00047         if(j <= 0)
00048             return;
00049         explosion.chunkName = null;
00050         for(int k = 0; k < j; k++)
00051         {
00052             Actor actor2 = (Actor)lst.get(k);
00053             if(Actor.isValid(actor2) && actor != actor2)
00054             {
00055                 msg.setListener(actor2);
00056                 msg.send();
00057             }
00058         }
00059 
00060         lst.clear();
00061     }
а вот тута запускаецца собна и обсчитываеться сам взрыв.
выделено- там где powertype 1 запускаеться 1 лишний метод(условно моно перевести как "пересчет осколков", т.е. вычисление кол-ва осколков. так что есть разделение )

правда пока неизвестно, рассчитываеться ли повреждение от осколков...мб ето токо заготовка

а вот собсна сам код взырвов:

Код:
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
00002 // Jad home page: http://www.kpdus.com/jad.html
00003 // Decompiler options: packimports(3) 
00004 // Source File Name:   Explosion.java
00005 
00006 package com.maddox.il2.ai;
00007 
00008 import com.maddox.JGP.Point3d;
00009 import com.maddox.il2.engine.*;
00010 
00011 // Referenced classes of package com.maddox.il2.ai:
00012 //            World, RangeRandom
00013 
00014 public class Explosion
00015 {
00016 
00017     public Explosion()
00018     {
00019         p = new Point3d();
00020     }
00021 
00022     void computeSplinterParams(float f)
00023     {
00024         float f1 = f * 0.9F;
00025         nSplinters = f1 / 0.015F;
00026         if(nSplinters < 0.5F)
00027         {
00028             nSplinters = 0.0F;
00029             return;
00030         } else
00031         {
00032             return;
00033         }
00034     }
00035 
00036     public float computeSplinterSpeed(float f)
00037     {
00038         if(f <= 0.01F)
00039             return 650F;
00040         if(f >= radius)
00041         {
00042             return 150F;
00043         } else
00044         {
00045             float f1 = f / radius;
00046             return 650F * (1.0F - f1) + 150F * f1;
00047         }
00048     }
00049 
00050     public void computeSplintersHit(Point3d point3d, float f, float f1, float af[])
00051     {
00052         float f2 = (float)point3d.distance(p) - f;
00053         if(f2 <= 0.001F)
00054         {
00055             af[0] = nSplinters * 0.5F;
00056             af[1] = computeSplinterSpeed(f2);
00057         }
00058         float f3 = 3.141593F * f * f;
00059         float f4 = 12.56637F * f2 * f2;
00060         float f5 = (nSplinters * f3) / f4;
00061         if(f5 >= nSplinters * 0.5F)
00062             f5 = nSplinters * 0.5F;
00063         af[0] = f5;
00064         af[1] = computeSplinterSpeed(f2);
00065     }
00066 
00067     public boolean isMirage()
00068     {
00069         if(!Actor.isValid(initiator))
00070             return true;
00071         else
00072             return initiator.isNetMirror();
00073     }
00074 
00075     public float receivedPower(ActorMesh actormesh)
00076     {
00077         float f = actormesh.collisionR();
00078         float f1 = (float)((Actor) (actormesh)).pos.getAbsPoint().distance(p);
00079         f1 -= f;
00080         if(f1 >= radius)
00081             return 0.0F;
00082         float f2 = 1.0F - f1 / radius;
00083         f2 *= f2;
00084         if(f2 >= 1.0F)
00085             return power;
00086         else
00087             return f2 * power;
00088     }
00089 
00090     public float receivedTNT_1meter(float f)
00091     {
00092         if(f >= radius)
00093             return 0.0F;
00094         if(f < 1.0F)
00095             return power;
00096         else
00097             return power / (f * f);
00098     }
00099 
00100     public float receivedTNT_1meter(Point3d point3d, float f)
00101     {
00102         float f1 = (float)point3d.distance(p) - f;
00103         return receivedTNT_1meter(f1);
00104     }
00105 
00106     public float receivedTNT_1meter(ActorMesh actormesh)
00107     {
00108         float f = (float)((Actor) (actormesh)).pos.getAbsPoint().distance(p) - actormesh.collisionR();
00109         return receivedTNT_1meter(f);
00110     }
00111 
00112     public float receivedTNTpower(ActorMesh actormesh)
00113     {
00114         float f = actormesh.collisionR();
00115         float f1 = (float)((Actor) (actormesh)).pos.getAbsPoint().distance(p) - f;
00116         if(f1 <= 0.0F)
00117             return 0.5F * power;
00118         float f2 = 1.0F / (float)Math.pow(f1, 1.2000000476837158D);
00119         if(f2 <= 0.0F)
00120             return 0.0F;
00121         if(f2 >= 0.5F)
00122             f2 = 0.5F;
00123         return f2 * power;
00124     }
00125 
00126     public static boolean killable(ActorMesh actormesh, float f, float f1, float f2, float f3)
00127     {
00128         float f4 = f;
00129         if(f4 <= f1)
00130             return false;
00131         if(f4 >= f2)
00132         {
00133             return true;
00134         } else
00135         {
00136             float f5 = (f4 - f1) / (f2 - f1);
00137             f3 += (1.0F - f3) * f5;
00138             return World.Rnd().nextFloat(0.0F, 1.0F) < f3;
00139         }
00140     }
00141 
00142     public static final int POWER_SPLASH = 0;
00143     public static final int POWER_SPLINTERS = 1;
00144     public static final int POWER_NAPALM = 2;
00145     public static final float SPLINTER_MASS = 0.015F;
00146     private static final float SPLINTERS_K = 0.9F;
00147     public String chunkName;
00148     public Point3d p;
00149     public float radius;
00150     public Actor initiator;
00151     public float power;
00152     public int powerType;
00153     private float nSplinters;
00154 
00155 }

собсна вот ото всего вот етого можете отталкиваеться...вот формулы моделирования взрыва в игре...сами формулы моно если что подрихтовать
исходя из этого и стоитпересчитывать пармеетры бомб
по воводу добавлений. скажу сразу, ето можно делать только В КРАЙНЕМ случае, если ето координально меняет картину. ибо сделать можно, но работы много( грю про ся, мб программер опытнее лучше сделает)

Последний раз редактировалось ZloyPetrushkO; 09.02.2010 в 16:59.
ZloyPetrushkO вне форума   Ответить с цитированием