예제 #1
0
 public static void InsertLinkBefore(link_t l, link_t before)
 {
     l.next      = before;
     l.prev      = before.prev;
     l.prev.next = l;
     l.next.prev = l;
 }
예제 #2
0
        /// <summary>
        /// SV_TouchLinks
        /// </summary>
        static void TouchLinks(edict_t ent, areanode_t node)
        {
            // touch linked edicts
            link_t next;

            for (link_t l = node.trigger_edicts.Next; l != node.trigger_edicts; l = next)
            {
                next = l.Next;
                edict_t touch = (edict_t)l.Owner;// EDICT_FROM_AREA(l);
                if (touch == ent)
                {
                    continue;
                }
                if (touch.v.touch == 0 || touch.v.solid != Solids.SOLID_TRIGGER)
                {
                    continue;
                }
                if (ent.v.absmin.x > touch.v.absmax.x || ent.v.absmin.y > touch.v.absmax.y ||
                    ent.v.absmin.z > touch.v.absmax.z || ent.v.absmax.x < touch.v.absmin.x ||
                    ent.v.absmax.y < touch.v.absmin.y || ent.v.absmax.z < touch.v.absmin.z)
                {
                    continue;
                }

                int old_self  = Progs.GlobalStruct.self;
                int old_other = Progs.GlobalStruct.other;

                Progs.GlobalStruct.self  = EdictToProg(touch);
                Progs.GlobalStruct.other = EdictToProg(ent);
                Progs.GlobalStruct.time  = (float)sv.time;
                Progs.Execute(touch.v.touch);

                Progs.GlobalStruct.self  = old_self;
                Progs.GlobalStruct.other = old_other;
            }

            // recurse down both sides
            if (node.axis == -1)
            {
                return;
            }

            if (Mathlib.Comp(ref ent.v.absmax, node.axis) > node.dist)
            {
                TouchLinks(ent, node.children[0]);
            }
            if (Mathlib.Comp(ref ent.v.absmin, node.axis) < node.dist)
            {
                TouchLinks(ent, node.children[1]);
            }
        }
예제 #3
0
        public float[] fields; // other fields from progs

        public edict_t()
        {
            this.area = new link_t(this);
            this.leafnums = new short[Progs.MAX_ENT_LEAFS];
            this.fields = new float[(Progs.EdictSize - entvars_t.SizeInBytes) >> 2];
        }
예제 #4
0
파일: Links.cs 프로젝트: critor/nPDF
 public Links()
 {
     uri      = new Uri("");
     page_num = -1;
     type     = link_t.NOT_SET;
 }
예제 #5
0
 // used for debugging
 //	float mins_rst[] = {0,0,0};
 //	float maxs_rst[] = {0,0,0};
 public areanode_t()
 {
     this.trigger_edicts = new(this);
     this.solid_edicts   = new(this);
 }
예제 #6
0
        /// <summary>
        /// SV_ClipToLinks
        /// Mins and maxs enclose the entire area swept by the move
        /// </summary>
        static void ClipToLinks(areanode_t node, moveclip_t clip)
        {
            link_t  next;
            trace_t trace;

            // touch linked edicts
            for (link_t l = node.solid_edicts.Next; l != node.solid_edicts; l = next)
            {
                next = l.Next;
                edict_t touch = (edict_t)l.Owner;// EDICT_FROM_AREA(l);
                if (touch.v.solid == Solids.SOLID_NOT)
                {
                    continue;
                }
                if (touch == clip.passedict)
                {
                    continue;
                }
                if (touch.v.solid == Solids.SOLID_TRIGGER)
                {
                    Sys.Error("Trigger in clipping list");
                }

                if (clip.type == MOVE_NOMONSTERS && touch.v.solid != Solids.SOLID_BSP)
                {
                    continue;
                }

                if (clip.boxmins.X > touch.v.absmax.x || clip.boxmins.Y > touch.v.absmax.y ||
                    clip.boxmins.Z > touch.v.absmax.z || clip.boxmaxs.X < touch.v.absmin.x ||
                    clip.boxmaxs.Y < touch.v.absmin.y || clip.boxmaxs.Z < touch.v.absmin.z)
                {
                    continue;
                }

                if (clip.passedict != null && clip.passedict.v.size.x != 0 && touch.v.size.x == 0)
                {
                    continue;   // points never interact
                }
                // might intersect, so do an exact clip
                if (clip.trace.allsolid)
                {
                    return;
                }
                if (clip.passedict != null)
                {
                    if (ProgToEdict(touch.v.owner) == clip.passedict)
                    {
                        continue;       // don't clip against own missiles
                    }
                    if (ProgToEdict(clip.passedict.v.owner) == touch)
                    {
                        continue;       // don't clip against owner
                    }
                }

                if (((int)touch.v.flags & EdictFlags.FL_MONSTER) != 0)
                {
                    trace = ClipMoveToEntity(touch, ref clip.start, ref clip.mins2, ref clip.maxs2, ref clip.end);
                }
                else
                {
                    trace = ClipMoveToEntity(touch, ref clip.start, ref clip.mins, ref clip.maxs, ref clip.end);
                }

                if (trace.allsolid || trace.startsolid || trace.fraction < clip.trace.fraction)
                {
                    trace.ent = touch;
                    if (clip.trace.startsolid)
                    {
                        clip.trace            = trace;
                        clip.trace.startsolid = true;
                    }
                    else
                    {
                        clip.trace = trace;
                    }
                }
                else if (trace.startsolid)
                {
                    clip.trace.startsolid = true;
                }
            }

            // recurse down both sides
            if (node.axis == -1)
            {
                return;
            }

            if (Mathlib.Comp(ref clip.boxmaxs, node.axis) > node.dist)
            {
                ClipToLinks(node.children[0], clip);
            }
            if (Mathlib.Comp(ref clip.boxmins, node.axis) < node.dist)
            {
                ClipToLinks(node.children[1], clip);
            }
        }
예제 #7
0
 public static void ClearLink(link_t l)
 {
     l.prev = l.next = l;
 }
예제 #8
0
        public entvars_t v; // C exported fields from progs

        #endregion Fields

        #region Constructors

        public edict_t()
        {
            this.area = new link_t(this);
            this.leafnums = new short[Progs.MAX_ENT_LEAFS];
            this.fields = new float[(Progs.EdictSize - entvars_t.SizeInBytes) >> 2];
        }
예제 #9
0
파일: common.cs 프로젝트: sbrown345/quakejs
 public static void InsertLinkAfter(link_t l, link_t after)
 {
     l.next = after.next;
     l.prev = after;
     l.prev.next = l;
     l.next.prev = l;
 }
예제 #10
0
 public areanode_t()
 {
     trigger_edicts = new link_t(this);
     solid_edicts   = new link_t(this);
 }
예제 #11
0
파일: common.cs 프로젝트: sbrown345/quakejs
 public static void InsertLinkBefore(link_t l, link_t before)
 {
     l.next = before;
     l.prev = before.prev;
     l.prev.next = l;
     l.next.prev = l;
 }
예제 #12
0
파일: common.cs 프로젝트: sbrown345/quakejs
 public static void RemoveLink(link_t l)
 {
     l.next.prev = l.prev;
     l.prev.next = l.next;
 }
예제 #13
0
파일: common.cs 프로젝트: sbrown345/quakejs
        /*


        All of Quake's data access is through a hierchal file system, but the contents of the file system can be transparently merged from several sources.

        The "base directory" is the path to the directory holding the quake.exe and all game directories.  The sys_* files pass this to host_init in quakeparms_t->basedir.  This can be overridden with the "-basedir" command line parm to allow code debugging in a different directory.  The base directory is
        only used during filesystem initialization.

        The "game directory" is the first tree on the search path and directory that all generated files (savegames, screenshots, demos, config files) will be saved to.  This can be overridden with the "-game" command line parameter.  The game directory can never be changed while quake is executing.  This is a precacution against having a malicious server instruct clients to write files over areas they shouldn't.

        The "cache directory" is only used during development to save network bandwidth, especially over ISDN / T1 lines.  If there is a cache directory
        specified, when a file is found by the normal search path, it will be mirrored
        into the cache directory, then opened there.



        FIXME:
        The file "parms.txt" will be read out of the game directory and appended to the current command line arguments to allow different games to initialize startup parms differently.  This could be used to add a "-sspeed 22050" for the high quality sound edition.  Because they are added at the end, they will not override an explicit setting on the original command line.
        	
        */



        public static void ClearLink(link_t l)
        {
            l.prev = l.next = l;
        }
예제 #14
0
 public areanode_t()
 {
     this.children = new areanode_t[2];
     this.trigger_edicts = new link_t(this);
     this.solid_edicts = new link_t(this);
 }
예제 #15
0
 public static void RemoveLink(link_t l)
 {
     l.next.prev = l.prev;
     l.prev.next = l.next;
 }
예제 #16
0
 public areanode_t()
 {
     this.children       = new areanode_t[2];
     this.trigger_edicts = new link_t(this);
     this.solid_edicts   = new link_t(this);
 }
예제 #17
0
파일: Links.cs 프로젝트: surjit/mupdf-1
 public Links()
 {
     uri = new Uri("");
     page_num = -1;
     type = link_t.NOT_SET;
 }