Jump to content

RorschachRev

Banned
  • Posts

    78
  • Joined

  • Last visited

Posts posted by RorschachRev

  1. Jagi: a game engine involves a Scene Graph and Collision Detection. I've only "written my own engine" in javascript for HTML5, but using Panda and playing with UE4 the engine and movement are directly related. UE4 demos have various movement styles. 

     

    My complaint about "Swordsman" I'll break down into various engine components. "clunky, buggy, random teleporting"

     

    The "clunky" behavior was actually needing very small "hit zones" to activate events. The hit zone detection (same as hitting X to use an object in WF) is a function of the Scene Graph. That is as "core engine" as you can get. In the case of "Swordsman" the activation zone for a chariot was nowhere near the graphical display, there was a zone several feet away that my friend used as a trigger. I had to jump up above the chariot, and then find the activation zone somewhere above the luggage area in order to "ride" it. That's scene graph, and "clunky" was the best way I could describe the annoyance without details. 

     

    Random teleporting was likely a desychronization between client and server out of synchronization, most likely networking related. With the client thinking I am in one location and the server not receiving updates, the server decides to reconcile the two issues by telling the client where it last remembers me, so I ended up teleporting back to a previous location, or to a location that the server hypothesized because it missed the turn, but kept the data about me moving forward. It projected me to locations I never stood. This is a combination of Scene Graph and network event synchronization, and very much "core engine" related.

     

    The "buggy" movement I observed was getting stuck moving up and down stairs, on objects that were smooth, etc. Now I've written code to do this in python and in javascript, where you compare the location of two objects. Python was 3D, Javascript was 2.5D. If the objects are touching, movement isn't allowed to continue in that direction because a collision has occurred. Simple enough concept, but it can be botched in interesting ways. Rubbing against a smooth surface preventing movement in other directions is a bug I had in my Javascript code, I fixed it by changing the bounds checking. "Swordsman" has not polished their code to the same degree, and you can get stuck while rubbing against smooth surfaces. The 3D code is more complicated, because there are height differences you need to prevent movement, and height differences that you need to permit it - in order to gradually climb stairs. (Instead of making players bunny hop the stairs.) "Swordsman" failed this comparison, and I could only sometimes climb stairs, other times I had to bunny hop them. 

     

    Please demonstrate how these items are not "engine related" and also please describe to me your issues with movement in "Swordsman" since you claim the problems are not engine related.

  2. If Warframe was ported to Unreal Engine 4, they would have to remove all of the worst parts like Flash, Internet Explorer and Lua. By contrast, UE4 is pure C++ code.

     

    UE4 has *a lot* of realistic lighting options. Static lighting is nice because it precompiles and no run time effort is needed. (e.g. less CPU/ GPU work while playing, more time spent recalculating when the level is built and cooked.)

     

    While UE4 and Warframe have a similar networking model, DE has spent a lot of effort into getting through NAT using several technologies with mixed success. UE4's codebase assumes that the game developer does this work, but don't include any code to do it. I'm doing some initial work on getting NAT punching into UE4 as a module for sale on the UE4 marketplace, using packet relays, STUN and ICE. 

     

    Apparently WF release 16 will have up to 8 players, my system can barely handle 4 and I can't host. (Laptops have their advantages, and disadvantages.) UE4 doesn't have a hard limit on simultaneous players, the main limitation is the number of replicated blueprints (objects that sync between clients <-> host <-> clients.)

     

    Since UE4 source code is open source on github to developers, perhaps WF will adopt some of the lighting models. UE does material interactions, the demo has objects of different materials that burn, freeze, shatter, etc using damage types. In UE4, the world can be composed of destructible materials that destroy in different ways. 

     

    With the Perfect World investment in DE, I bet that the "next title" that DE works on will use EE as well, in order to rape pocketbooks of players. The last game that Perfect World released, the movement was atrocious. I couldn't stand trying to move around, it was clunky, buggy, involved random teleporting while moving around a level, etc. 

     

    One of the the things that Epic has going for them is that they can focus on just the engine development, while DE needs to make a playable game that is fun. In a year or two the UE4 games will hit the marketplace, and they will be insanely good. (I'm trying to put together some art assets and stuff, rough going for independent developer!) DE is experimenting a bit (see this webm movie) https://warframe.com/sanctuary/? and still hiring Flash developers http://www.digitalextremes.com/careers/postings/programming/ui-programmer (I refuse to do Flash development, ever since I made a callback interface in AS3 and Adobe screwed up the whole "equal text is equal code" thing completely. I can't imagine anybody who knows C++ doing Flash!)

  3. 20 bytes?!?! 

    For 3D position and orientation, some games use as little as 2 bytes total. I don't see why you need 5 32 bit numbers in order to store this information. 

    1 byte for ID allows for 256 unique object references, I'd make it a cap of 128 by using a 7 bit number

    1 byte for rotationallows for 360 degrees, with a 2 degree precision. I'd make it 512 degrees with a 9 bit number (use bit shifting on both pieces of data for fast extraction to a 32 bit number if you need one.)

     

    If the positions are tracked by full meter increments, then 1 byte allows for 1 meter resolution up to 256 meters away. I would use a map ceiling, probably 128 meters high, allowing for a lower limit set vertically. 2 bytes per direction would allow for 256 meter maps, with 0.004 meter resolution.

     

    That's a total of:

    1 byte ID

    1 byte rotation

    2*3 bytes for location.

    8 bytes total.

     

    How do you end up with 20 bytes? I can probably just look at the network traffic and figure it out, but I'm just shocked.

  4. Ah you miss the subtle joke of uPNP. It isn't universal, so a lower u. Plug Not Play. When I worked for Microsoft I took the handle POSOS because it was a POS OS. (Especially the version I worked with.)

     

    There is one set of problems making a connection, and another maintaining game state between all machines. The "P2P" aspect of the game networking is a misnomer, because P2P networking is actually written well. The difficulty I am extremely vexed over isn't the session, but the failure to connect ports. I understand the issues associated with using SOCK_DGRAM instead of SOCK_SEQPACKET (aka UDP and TCP). My understanding of the issue, and the reason that changing the router helped, is the communication dialog between the intended host and intended client about "what IP:PORT can I find you?" This is complicated by the fact that the port isn't really "open" in most situations, the UPnP (uPNP) is supposed to solve those problems a little bit. Unfortunately they are relying on a broken insecure methodology of having clients talk. Realistically if a port is open, forwarded, and static, that information can be passed by game client intending to be host to DE server to intended client. For some reason, an open port isn't enough for DE's programming. WTF? The port is open. Open. Waiting for connections. Their socket() call fails WHY? The failure is at Layer 3 of the seven layer networking burrito. 

     

    For gaming, the whole "TCP vs UDP" has been discussed to death. TCP means that the network card could handle a lot of the overhead if you have a good one. (ASIC is the future of increased performance for another few years, so embrace low level where possible.) UDP is faster, but you have to handle missing packets, out of order packets, etc. I remember back in the day when cDc used triple UDP for back orfice administration - it does work with higher level logic. NAT tables are annoying to traverse, and it bypassed many stateful packet filters of that day. (I still like firewalker personally.) 

     

    It sounds like your complaint is about shoddy transactional programming that assumes the network layer is always correct. (It isn't.) My complaint is inability to connect, not the lack or issue with their transactional systems.

  5. Don't get me wrong, I really like the new system. The polarity bit takes new players a few minutes to figure out. Auras a bit longer, they don't want to equip one thinking it will cost them mods.

     

    There are 47 mods for your warframe, according to the wiki. 

     

    @Pythadragon

    I used to wear sprint based mods when I thought that sprinting was a faster way to move. When moving quickly, advanced players are usually doing spin melee, 'coptering', etc. The mobility of weapons varies a lot (compare spin and jump melee of dagger to Bo) Advanced players might use something like Aviator (I want this event only mod) in a "mobility slot".

     

    The knockdown affecting mods might be overpowered in a "mobility slot", I'd personally probably run with Handspring or Sure Footed from the vanilla mods that I own. If I could get it, I'd run with Aviator. For utility, I'd probably continue to use Thief's Wit but feel less guilty about it. For excavation (while the spawns and pathfinding are so bad) I'd want Enemy Sense, but I wouldn't run with it normally. 

     

    Some examples of what I'd consider "mobility" mods: Acrobat, Aviator, Handspring, Heavy Impact, Maglev, Marathon, Quick Rest, Rush, Shield Flux, Shock Absorbers, Sure Footed, 

     

    Some examples of what I'd consider "utility" mods:  Enemy Sense, Intruder, Master Thief, Thief's Wit.

     

    With the bonus to something non-mobility, Nightmare mode mods become more valuable by using these slots. Constitution, Fortitude.

     

    I think that having these 2 extra slots would allow DE to make more mods that aren't just abilities or health/shields based that would actually get used. A few ideas that could go into "utility" might be vision/sound based (for better stealth ability), traps and cameras avoidance, highlight secret switches in the environment, codex scan use (I have been playing more with manual codex scans for filling out my boss codex when Helios won't survive), increased loot range (somewhat like carrier, possibly enhancing carrier further), increased capture speed (for 2 player interception), medic to revive teammates faster, etc.

  6. Warframe mod slots are almost completely taken by "mandatory choices." Why use Quick Rest over Redirection? Reflex Guard over Vitality? It isn't that these are bad abilities or not useful, the problem is that I'm not going to give up Flow to put in a limited use mobility mod. If we had a slot for just mobility mods, and another for Ability Augments (or utility like Master Thief), more of each would get used. They could go next to the Auras so there isn't much redesign of GUI. The restrictions should be similar to equipping a stance: 1 slot for mobility only and 1 slot utility/ability augment only. Right now they are just sold for credits.

     

    I like the design philosophy of "explore more of the game" that goes into the weapons and warframes. I hope that this philosophy is extended slightly to the mods as well, making some of the Warframe mods actually viable for deployment, instead of a neat ability I'm never going to give up another mod to use. 

  7. Central relaying of data via a dedicated SOCKS5 server would be better than P2P in terms of overall bandwidth management required to host. Uploading 1 copy of the data is far better than uploading 4 copies with latency. I linked source code for client patches, and software for server. I'm tempted to just call with a business proposal if they don't reply by the time I finish this project for pay.

     

    The most optimized 3D data position code I recall was 1 byte per object, plus the object description. This was heralded as the "theoretical ideal" but I haven't done the math myself. I might take a look at their network data to see how bad it is depending on how bored I get. 

     

    For a  "dedicated server" that focuses on data routing only, a quick optimization of network data is finished. Case 1 isn't dealt with, but perhaps the Host could allow a "join" of a reconnected player with a better grace period (a grace period at least as long as it takes me to restart the game after a crash - usually the Evolution Engine is still trying to close the memory leak by the time the grace period is over.) Case 2 is a mix of host migration and data replay, the reasons for the host crashing seem to vary from memory, CPU, network, engine crash, weird bugs, etc. They just need more stable code in general in order to fix some of these issues. The tradeoff tends to be "content or stability" and a middle ground is hard to find. Case 3 not dealt with either, but the grace period may help. Case 4 "insane" is probably due to the new host being unsuitable to handle the requirements.

     

    For a server that keeps track of the Scene Graph and loot tables: network code is almost exclusively download, Case 1 is grace period but with easier fix (after doing a lot of ground work and infrastructure), Case 2 shouldn't happen any more (depending on stability of the server), Case 3 is grace period, Case 4 shouldn't happen any more (depending on performance of the server). 

  8. Here's the source code to the eMule uPNP client in C with Visual Studio project files. It also compiles with gmake according to the author. http://sourceforge.net/p/emule/code/ci/dev/tree/miniupnpc/ 

    C++ for Async proxy connections http://sourceforge.net/p/emule/code/ci/dev/tree/AsyncProxySocketLayer.cpp

    Drop in replacement for MFC library that includes support for the socks/proxy routines (above), and thereby supporting their LowID routing method on the servers. http://sourceforge.net/p/emule/code/ci/dev/tree/AsyncSocketExLayer.cpp Obviously more complex than I'm going to post here, but also *not bad* and source code that compiles as an example.

     

    Sounds like the LowID eMule routing is just a SOCKS 4/5 server that everyone connects to. This should be dead simple to configure on the server side , and client side just needs the open source C++ supplied. Server side tsocks and varnish aren't suitable. http://www.inet.no/dante/ is a BSD license, has commercial support, claims to be high performance SOCKS server.

     

    Dante has a performance document: http://www.inet.no/dante/doc/1.4.x/dante_performance_1.4.0.pdf with some useful data:

    "Sustained send/receive rates of around 0.8 Gigabit/s in each direction and combined rates of around 1.5 Gigabit/s (see Figure 1). IP-packets are for most of the two week period received and transmitted at a steady combined rate of around 250,000 packets per second, with around 150,000 of these being TCP segments, and around 100,000 being UDP packets. Roughly the same amount of packets are sent and received." Since the game is UDP based, the number of packets and overall bandwidth that Dante could handle would be higher.
  9. $40 spent on router instead of $20 given to DE. Fixing bad code with hardware upgrades isn't something most players (especially console players) will be willing to do. I imagine some kids will be able to talk their parents into completely redoing the wifi network and internet router, and some kids won't. I wonder what demographic DE is targeting with their game? 

  10. TL;DR: I want them to fix it.

     

    The select() method of handling network sockets in the linux kernel uses file descriptors. The main advantage is high I/O throughput without blocking. http://man7.org/linux/man-pages/man2/select.2.html The select() method can scale to having 1000 simultaneous sockets fairly well, but not an order of magnitude more than that. For limited networking, it works really well. For server side networking it can not be used to solve the C10k problem. http://en.wikipedia.org/wiki/C10k_problem on a single machine. The number of servers necessary drastically increases by the limitations of select(). 

     

    What I'm actually after is a game that works. I can't play with my IRL friends most of the time with anyone else. I'm buying them a new router that will arrive next week. My personal ax to grind probably won't be as sharp if spending another $40 allows us to play a F2P we've put money into. 

     

    As for my qualifications, I've done stuff. I'd rather not talk about it here, mostly because I wouldn't be believed. My resume is verifiable by human resources staff. I've written a few protocols (TCP based, UDP based, two rode on TCP WebSockets) so I know more about this topic than your average 50k/year programmer.

     

    The mental trap that DE has fallen into in terms of design is a really easy one to adopt by mistake. The idea is that a server suddenly has to do all of the work of the hosting, and that a client needs a direct TCP/IP connection initiated P2P. The pure P2P method is limited, and thousands of people have worked on it to provide a better connection for BitTorrent and eMule. Even when solutions within a protocol have been developed, not all clients embrace those solutions: http://en.wikipedia.org/wiki/Comparison_of_eDonkey_software My wishlist for the patching system would include LANCast and some of the protocol and hashing tricks. Warframe simply fails in most situations with most router hardware in the marketplace today, preventing people from playing together. The problem workaround in the eMule/eDonkey protocol is server routed connections. http://www.emule-project.net/home/perl/help.cgi?l=1&rm=show_topic&topic_id=103 I was looking for some of the C++ code that actually implements it, but I didn't find it in 5 minutes. The protocol description has byte offset descriptions and ascii art of UML models, but doesn't describe the server routed connections.

     

    I was proposing something more aggressive, and that was UDP relay by server. That would allow incremental adoption of server hosting, while still allowing anyone with an outbound UDP connection the ability to play with anybody else picking the same matchmaking.

     

    DE claims the networking issue of Strict NAT only affects 7% of the playerbase, but the #1 topic of discussion in our clan is consistently "who can invite/host players A, B?" We've made lists, but they don't work after random changes. What do I want? I want to play Warframe with my friends. DE doesn't want Dedicated servers or Dedicated client to client proxies, but the reasons provided are invalid. From these forum posts? I'd like to figure out the real reasons or disabuse people of incorrect assumptions. I was encouraged to post by my friends and propose solutions with the assurance that the community managers would respond. There was a well written post by another OpenBSD user (I haven't used it for many years) describing the flaws in various NAT technologies and describing why the DE approach wouldn't work when Warframe hit prime time. We're currently in that situation and the networking issues may kill a great game, great company, great concept and fun play. I just get exasperated at my inability to play with the people who recruited me to the game.

  11. The Devs understate how serious the matchmaking issue is. Out of 12 people online in our clan, we were able to find one set of 4, two sets of 3 that could play together. We also had a few pairs. With the Void Keys becoming more expensive, our ability to play together is even more limited while hunting drops. Matchmaking shouldn't be so hard to find people to play with.

  12. TL;DR version:

    I can make a "matchmaking server" that is "outbound only" and can ignore all of the firewall and NAT issues. 100k simultaneous users on one server. 1-4 weeks for working prototype if DE agrees and modifies the client to talk to the server.

     

    Caveat: That isn't a true server hosted option, it just fixes all of the networking issues. Incrementally,  it can become aware of map data (scene graph), NPC behavior (A*, decision trees, etc), physics calculations as tasks (allowing all 4 clients to perform physics calculations instead of 100% by host, possibly with double checking); and collision calculations (ray tracing on the scene graph).
     

    Server Hosting: I use a real data center, and my server at the data center has 8 CPU, 32GB of RAM, and streams about 40 TB / month of data. (I'm streaming TCP data of 80-180 Mbps constantly)

  13. I think a lot of people would pay 1 plat for a hosted games, or 1 plat for 5 hosted games. I'd be willing to work on making a dedicated server to host sessions, but I wouldn't do it on windows if at all possible.

     

     In my knowledge of MMORPG programming that involves collisions you have a few severe computational challenges. The first is "hit boxes" meaning the geometric shapes that represent a "hit" on a target. The second is pathfinding and AI behavior. 

     

    My idea would be to keep a copy of the scene graph server side, but do the ray tracing, hitboxes and collisions calculated by clients the way they are now. Generating pseudo-random numbers from a seed value is pretty common. With the seed value in common, everyone gets the majority of data. Some issues like Kohm firing a spray of bullets and all either colliding or  bouncing could be elegantly solved client side (hopefully with wave functions) and then delivering the results to the server, which shares the relevant data (usually displaying the exp gained from kills). Erlang's ejabberd would have 1 million simultaneous clients in chat on a single server. The parallel distribution of data is not the issue here.

     

    I assume from the performance issues in game that all of the calculations are done by the host. If the host is CPU bound, then we get lag on movement and too many objects on screen. If the host is RAM bound, then we tend to hang or crash at the same spot in the map consistently. Texture memory was too high on my Toshiba laptop, and that caused crashes on detailed tilemaps. I posted on the AI thread various AI and pathing issues. 

     

    A* is a common pathfinding algorithm (Djurksta's being more optimal in some cases) and can be used as a method of solving many different problems, including approximations NP-Complete problems. AI could probably be calculated server side on a dedicated server, but the scalability varies by active tilesets, grouping behaviors, etc.

     

    At this point poking into some of the messages sent to/from server is something I'm interested in doing. A simple "dedicated host" would be a simple packet forwarding system or message queue and relaying system and could probably be written in C+Python in a few weeks. With a proper handshake, this would solve all "peer host" issues, and anybody could play with anybody as long as they are allowed to log in. The message queue and broker system could be altered for more server side calculations over time, possibly becoming more aware of the game logic incrementally.

     

    In terms of UI, cost and revenue, I suggest a "server hosted" and "server relay" as a matchmaking types to be added. From a player standpoint, I'd like to block certain kinds of warframes or request certain kinds of warframes. I'd like to only play with Loki players who I know won't troll me off a cliff, into walls, etc. I'm sick of seeing the "humor" of a Mastery Rank 9+ Loki player wearing an MK1 Braton on a survival or excavate mission. They seem to think the humor is increased by doing this on alerts. With a better matchmaking system and hosting system, we could implement some player filters. (Warframe, Conclave, Clan only, Ally Clans from a list, etc) Even more amazing, we could possibly have popups and send out invites! The key feature here is a dedicated server, and I could hack together something that loads fairly quickly with DE's blessing and some proxy features. It is only UDP after all.

  14. Their networking code is somewhat broken. I have had different results using the same two LAN computers over the last month even without any settings changes. Last week only I could host, this week only the other computer can host. If you can get a firmware update for your router, that's the best option you have. UPNP implementation here is pretty bad :/ The port forwarding should always work, and it is a complete and utter fail. 

  15. I am filing a bunch of bug reports about the game, following the rules by breaking them into separate topics and posting them in the appropriate threads. Here's the first and most important (and easiest to fix) bug report:

    https://forums.warframe.com/index.php?/topic/376332-steam-failures-required-warframe-fixes-for-steam/

    Here is my reported AI bugs, and some recommendations on fixes:

    https://forums.warframe.com/index.php?/topic/376364-ai-issues-reported-from-ai-developer/

  16. I could host 1000 simultaneous game sessions for $80/month I bet. The pathfinding and hitboxes are the most expensive CPU calculations. 

     

    It *is* a bug when people can't play. I *did* detail a minor work around for LAN gaming, one person has ports forwarded and they are a client, the other person uses uPNP and is the host.

  17. I should mention that the web stack using websockets and everything else I wrote used about 45 lines of code and including memory management, memory maps, timers, a stored history for new connection clients, auto reconnect, auto resume, read settings from a configuration which it parsed, and was production quality code. This server thing is only as hard as you make it really.

  18. TCP/IP works as a protocol by having unique ports for different things. TCP can handle multiple sessions on a single port well because they have a bunch of information talking about the data being transmitted as a session. UDP does not have that extra session data, and would require a great deal of extra programming to make individual UDP sessions on a single port. I recommend using a unique set of ports for each computer behind a router. Your router will have documentation on how to forward the ports, but I found that using uPNP was better than manual port forwarding. With 2 computers behind an ancient DSL router, we used unique ports and manually forwarded the ports for both computers. We could play with each other, but couldn't join sessions. I put my laptop to use a different set of ports (not forwarded by router) and enabled uPNP on mine, while the other computer was manually forwarded. This works great for group play as long as I host, and neither myself or LAN partner have lag.

     

    Having the port forward fail so much is a sad state of affairs. Having a port forward and a uPNP work for LAN play is the best we've done and an interesting hybrid failure as well.

     

    My suggestion would be to have some actual game servers instead of just having some accounting servers. Even if Evolution Engine has a creative solution for lowering server costs, it isn't acceptable to have so many failures. I doubt that XBox and PS3 will have no networking problems, and their expectations as users is typically that it should just work. PC gamers are used to fiddling with settings a bit more, but I can't see the market really accepting the current state of networking.

     

    On the servers, I highly recommend co-routines. The old SELECT methodology is limited as file system handlers since each socket is treated as a file handler. The high performance systems I've seen were Python and gEvent based. Using that combination, I was reading a 1MB shared memory buffer, converting it from bytes to JSON, pushing out to 100 clients every second via websockets, and using less CPU time than having a process list via "top" running for a few minutes. (No webserver necessary in that 'web' stack.) This scales well to 100k simultaneous users per machine. Not "per second" but "simultaneous" which is a much higher number of open connections. TCP tends to have more overhead than the delivery mechanism, so using UDP will scale well server side. Player host by default sure, but server host a game session for 1 platinum or for subscribers. After it scales and works well, I'd suggest having server-hosted as a failback for free.

  19. TCP/IP works as a protocol by having unique ports for different things. TCP can handle multiple sessions on a single port well because they have a bunch of information talking about the data being transmitted as a session. UDP does not have that extra session data, and would require a great deal of extra programming to make individual UDP sessions on a single port. I recommend using a unique set of ports for each computer behind a router. Your router will have documentation on how to forward the ports, but I found that using uPNP was better than manual port forwarding. With 2 computers behind an ancient DSL router, we used unique ports and manually forwarded the ports for both computers. We could play with each other, but couldn't join sessions. I put my laptop to use a different set of ports (not forwarded by router) and enabled uPNP on mine, while the other computer was manually forwarded. This works great for group play as long as I host, and neither myself or LAN partner have lag.

  20. In U shaped pathfinding situations, spawns near the base of the U take either fork pseudo-randomly. With my warframe at at one end of the U I can shoot the other path where enemies clump together. They tend to wander a few feet back and forth looking for something. I don't know what their "seek" behavior is in this case, but obviously the A* implementation needs to have a deeper path. I suggest "depth first" over "breadth first" in this type of map. 

     

    The pathfinding for the seekers that latch on to the Tenno is broken for partial positions. Placing my Tenno between 0.3 to 0.5m from a flat wall, the seeker failed to attach. It would follow a continuous B shaped path, bouncing off the wall and appearing confused. I believe this is a rounding issue, with integers being in the A* implementation but unable to find me at position 0,0 or 1,1 (since I was at 0.3,0.4 or something) Floating point numbers have a harder 'cost metric' to calculate, but in this case erratic behavior and a complete failure probably costs more. I'd suggest switching to floating point in the first 'try, catch, fail' at low distance (under 5 meters?).

     

    I personally program my OO designs in Python, so I can see some of the C++ challenges you're having from outside the design. One case where this is very obviously a failure is when an object has updated AI, but then reverts back to a flaw listed in a previous bugfix. For example, an Arson Napalm Grineer that was immune to damage while under Nyx Mind Control on Orokin Derelict tileset, infested with Grineer invasion exterminate. This is a bug that had been fixed in previous bug fixes, but resurfaced. There is some "in object" hotfix code that shouldn't be there, but previous behavior resurfaced when one of those segments overwrote the actual bug fix. I'm sure your Object hierarchy is pretty messy by this point, but hopefully you're not dealing with the headaches of callback debugging mechanisms with polymorphism. A code cleanup will prevent debugging the same issue repeatedly, and probably be a net gain after the second or third bug avoided. Bugs cost more development time than development (especially in C++ and Java).

     

    Kubrows can be avoided by standing on their own den. When they jump and fall off the tileset, it renders them damage immune. Looping AI causing the Kubrows to run in circles. I'd fix both issues by having a cost by height metric in their try-fail-catch. I was impressed at their gap jumping, but they seemed to following well declared waypoints.

     

    We've avoided Perrin by jumping in a hole, climbing a staircase and standing next to a ledge, etc. Ember's Ring of Fire breaks some monster AI, the Ancients can be put into an unresponsive state by doing Ring of Fire near them without another path nearby (Avoiding fire seemed to break their pathfinding ability for the whole spawn. We stood just outside the aura range and dumped 3 full loads of max ammo into them without needing another blast of fire.)

     

     

×
×
  • Create New...