We can debate all day about if pirates flying XS cube ships with L Railguns have any class or not (spoiler: they don't, cubes are lame), but I think we can all agree that the current iteration of PvP has plenty of problems.
Current Problems:
Lock-on range is only determined by core size
Some weapons have ranges that are greater than the minimum Lock-on range
Weapons have no/minimal accuracy falloff with increasing range
Weapons have no/minimal accuracy loss for high transversal velocities and accelerations
My Proposed Solutions:
1: Lock on range needs to be based on different parameters. The current meta of L guns on XS ships is problematic, since S and M ships (even if they also have L guns) are outranged and don't even get an opportunity to fight back. I propose splitting lock-on into 4 separate "Radar" units:
Radar - lock-on range based on sum of ship's 3 cross-sections (already calculated, and doing it as a sum encourages non-cube ships)
Gravimetric - lock-on range based on ship's mass (already calculated, makes heavy ships easier to detect whether its cargo or armor)
Thermal - lock-on range based on magnitude of the ship's maximum thrust in newtons (already calculated, makes ships with lots of engines easier to detect)
Electromagnetic - lock-on range based on power capacity and shields (obviously only useful when/if those systems are added)
Balancing the ranges from the 4 methods will take some trial and error, but overall it would make detection more "fair" by adding more control handles for NQ to balance.
2+3: Weapons being able to shoot far is very reasonable, and is really a necessity for the BVR combat caused by the velocities of ships in space. With the lock-on changes above, #2 becomes less of a problem. However, just because your weapon CAN reach that far, doesn't mean it should have great accuracy at doing so. Weapons should be able to fire when they are locked on, regardless of range (maybe missiles would be an exception to this), but should have accuracy falloff due to that range. Additionally, lasers should have damage falloff with range. I'd like to see the weapons rebalanced accordingly:
Railguns - high accuracy, low rof, moderate damage
Cannons - moderate accuracy, moderate rof, moderate damage
Lasers - high accuracy, high rof, damage falloff at range (low damage at long range, moderate damage at short range)
Missiles - moderate accuracy, low rof, hard cap range limited (high damage at short range)
4: Unless you are exactly in the target's flight path, you shouldn't be able to hit someone blazing past at 30k kph, aka "0.99c". Accounting for transversal velocity forces pursuers to match velocities in order to have high hit chances, not just reduce the distance. This means that weapons need a "tracking speed" property, so that some are better than others. While tracking speed should vary by weapon type, it should primarily vary by weapon size so that Large weapons have low accuracy at high transversal velocities. This solves the "the ultimate ship is the biggest ship covered in the most armor and cannons" problem, by making it hard for large weapons to target faster moving ships. While that can be overcome by adding a ton of engines to make "the ultimate ship" accelerate like a fighter, it will also drastically increase their Thermal signature thus allowing smaller ships to plink them to death from out of range. Additionally, if transversal acceleration and facing cross section were taken into account, small and quick ships like fighters would be harder to hit.
Now some of you are going to say "but SGCam, that sounds a lot like the combat mechanics in EVE." And you are right, it does. But as with many things in DU that take inspiration from EVE, Lock+Fire combat is one of them. That system overall works pretty well for EVE, and the more granular and customizable nature of DU means that it can be even more effective here. I'm also looking forward to warp interdiction and tackling, but that would be a whole other post.
Overall, the more complex the mechanics, the less all-around advantage "meta" builds have. They may be powerful in certain situations, and that's ok - as long as they are weaker elsewhere due to their optimization. Adding tradeoffs opens up the design space for more varied and interesting PvP, and will hopefully prevent us from playing "Cube Gank Squad 2020" going forward.
So ok - fine it scales to 8 - but at a certain point it clearly won't matter - and I am under the assumption that anything beyond 16 cores for DU will be pointless - but was hoping someone out there with an overkill build could confirm.
If you bury the cores in elements and/or enclose the ship in large glass windows and then abandon the ship, people could view it but not repair/claim and it wouldn't count towards your limit anymore.
My suspicion is simply that there is NOTHING else out there that brings the other elements to the table like this game does. The market is pretty bereft of offerings and I found myself mostly playing Space Engineers had this not come along and even that was starting to get stale no matter how many mods I threw on the pile.
if all the other facets of the game were terrible, such as ship building, industries, talent tree design, voxel deformation based terraforming etc..if all of those were subpar aspects of gameplay but PVP combat was exceptional, then I think the only people even chatting in this forum would be hard core pvp folks.
The game offers enough elements that as a package cant' be found anywhere else that it is going to draw a diverse crowd.
I'm personally on the fence and reserving judgement until there are more specifics on actual mechanics, inter-safe zone travel etc. I've done my share of 3d newtonian based physics pvp in a very old game called Jumpgate, but I'm just getting too old for it anymore. With that said, I understand the appeal.
My irony meter just broke..... you owe me a new one
Still confused why we are arguing over a pvp zone which is completely optional for players to enter, in a game where the main pvp mechanics have not even been properly outlined, let alone confirmed.
With current mechanics it will be very difficult for "unsponsored" players to do much. Including both new players and returning players.
it’s a big ask to get a new player into the equivalent of a 0.0 Corp in the month or two it takes them to empty their sanctuary claim, or a returning player in a day or two to return to a 0.0 equivalent Corp since their sanctuary claim is already emptied out.
The game also lacks the permeable boarder that EVE has with a large green/yellow/red boarder, and Wormhole systems that increase those number of systems in both mass (number of exits)/randomness.
This is 100% eve online. It's bad when you arent even surprised by people there anymore. 18 years after release, you will still see an occasional new person get ganked, then go on a rant about how its poor mechanics and ganking is the reason eve is dying. And this may be anecdotal, as I know salt comes from anywhere, but after playing for 10 years of eve, I've been called the N word on more than one occasion in eve. And it was only when I ganked a miner in "High Security" space. Coincidence? You be the judge.
Requires
3 Programming Boards
2 Databanks --two is needed to prevent weird code crossing bugs. later this may be less when they fix bug.
20 Containers of same Size
1 screen
1 switch
1 relay
PB1->switch-> relay-> PB2 PB3
Create Events in Lua Editor and Paste the Following as Instructed.
9/17 - Fixed parameter for single boards.Changed some names and Added more exports
Programming Board 1 -- Can do 9 Containers OR Read from Databanks
---screen
---databank-----only if your doing more than 9 items added last
---databank2-----only if your doing more than 9 items(using 2 helps code from being crossed from bugs)added last
---switch-----only if your doing more than 9 items
----Unit Start
if Morethan9slots == "On" then
switch.activate()
end
unit.setTimer("Live",1)
unit.hide()
----Unit Tick ---Name the Tick Live
Morethan9slots = "Off" --export:Off for 9 slots and On for more than 9 and requires databanks.
local containermax = 9600 --export:;Your max container holding.
local slot1item = "Bauxite" --export:;Slot1 Iten.
local slot1weight = 1.28 --export:;Slot1 weight.
local slot2item = "Coal" --export:;Slot2 Iten.
local slot2weight = 1.35 --export:;Slot2 weight.
local slot3item = "Hematite" --export:;Slot3 Iten.
local slot3weight = 5.04 --export:;Slot3 weight.
local slot4item = "Quartz" --export:;Slot4 Iten.
local slot4weight = 2.65 --export:;Slot4 weight.
local slot5item = "Chromite" --export:;Slot5 Iten.
local slot5weight = 4.54 --export:;Slot5 weight.
local slot6item = "Limestone" --export:;Slot6 Iten.
local slot6weight = 2.71 --export:;Slot6 weight.
local slot7item = "Malachite" --export:;Slot7 Iten.
local slot7weight = 4.0 --export:;Slot7 weight.
local slot8item = "Natron" --export:;Slot8 Iten.
local slot8weight = 1.55 --export:;Slot8 weight.
local slot9item = "Acanthite" --export:;Slot9 Iten.
local slot9weight = 7.2 --export:;Slot9 weight.
if Morethan9slots == "Off" then
local dbhtml = ""
local dhtml = ""
local index = {1, 2, 3, 4, 5, 6, 7, 8, 9} -- Row of Container?
local containers = {slot1, slot2, slot3, slot4, slot5, slot6, slot7, slot8, slot9} -- slot names
local weights = {slot1weight, slot2weight, slot3weight, slot4weight, slot5weight, slot6weight, slot7weight, slot8weight, slot9weight} -- inspected kg of item
local items = {slot1item, slot2item, slot3item, slot4item, slot5item, slot6item, slot7item, slot8item, slot9item} -- names to display
local htmlContent = ""
for i=1, #containers do
htmlContent = htmlContent .. "<tr>".."<th>"..index[i].."</th><th>"..items[i].."</th><th>"..math.ceil(((math.ceil((containers[i].getItemsMass()/weights[i]) - 0.5)/containermax)*100)).."%</th><th>"..math.ceil((containers[i].getItemsMass()/weights[i]) - 0.5).."</th><tr>"
end
local html = [[
<table style="
margin-left: auto;
margin-right: auto;
width:30%;
font-size:1.25em;
text-align:left;">
<tr style = "
background-color:Purple;
color:black !important;">
<svg>
<g>
<text xml:space="preserve" text-anchor="start" font-family="Helvetica, Arial, sans-serif" font-size="30" id="svg_8" y="50" x="10" stroke="#ff0000" fill="#ff7f00">PB1</text>
</g></svg>
<th>Row</th>
<th>Product</th>
<th>Container%</th>
<th>Total Ore</th>
</tr>
]]..htmlContent..[[
</table>]]
screen.setHTML(html)
elseif Morethan9slots == "On" then
switch.activate()
dbhtml = databank.getStringValue(OreMonitorTwo)
dhtml = databank2.getStringValue(OreMonitorThree)
local index = {1, 2, 3, 4, 5, 6} -- Row of Container?
local containers = {slot1, slot2, slot3, slot4, slot5, slot6} -- slot names
local weights = {slot1weight, slot2weight, slot3weight, slot4weight, slot5weight, slot6weight} -- inspected kg of item
local items = {slot1item, slot2item, slot3item, slot4item, slot5item, slot6item} -- names to display
local htmlContent = ""
for i=1, #containers do
htmlContent = htmlContent .. "<tr>".."<th>"..index[i].."</th><th>"..items[i].."</th><th>"..math.ceil(((math.ceil((containers[i].getItemsMass()/weights[i]) - 0.5)/containermax)*100)).."%</th><th>"..math.ceil((containers[i].getItemsMass()/weights[i]) - 0.5).."</th><tr>"
end
local html = [[
<table style="
margin-left: auto;
margin-right: auto;
width:30%;
font-size:1.25em;
text-align:left;">
<tr style = "
background-color:Purple;
color:black !important;">
<svg>
<g>
<text xml:space="preserve" text-anchor="start" font-family="Helvetica, Arial, sans-serif" font-size="30" id="svg_8" y="50" x="10" stroke="#ff0000" fill="#ff7f00">PB1</text>
</g></svg>
<th>Row</th>
<th>Product</th>
<th>Container%</th>
<th>Total Ore</th>
</tr>
]]..htmlContent..[[]]..dbhtml..[[]]..dhtml..[[
</table>]]
screen.setHTML(html)
end
---Unit Stop
if Morethan9slots == "On" then
switch.deactivate()
end
screen.clear()
Programming Board 2
--databank is last slot to add and named databank
---Unit Start
unit.setTimer("Live",1)
unit.hide()
----Unit Tick ---Name the Tick Live
--databank is last slot to add and named databank
local slot1item = "Malachite" --export:;Slot1 Iten.
local slot1weight = 4.0 --export:;Slot1 weight.
local slot2item = "Natron" --export:;Slot2 Iten.
local slot2weight = 1.55 --export:;Slot2 weight.
local slot3item = "Acanthite" --export:;Slot3 Iten.
local slot3weight = 7.2 --export:;Slot3 weight.
local slot4item = "Garnierite" --export:;Slot4 Iten.
local slot4weight = 2.60 --export:;Slot4 weight.
local slot5item = "Petalite" --export:;Slot5 Iten.
local slot5weight = 2.41 --export:;Slot5 weight.
local slot6item = "Pyrite" --export:;Slot6 Iten.
local slot6weight = 5.01 --export:;Slot6 weight.
local slot7item = "Colbaltite" --export:;Slot7 Iten.
local slot7weight = 6.33 --export:;Slot7 weight.
local slot8item = "Cryolite" --export:;Slot8 Iten.
local slot8weight = 2.95 --export:;Slot8 weight.
local slot9item = "Gold Nuggets" --export:;Slot9 Iten.
local slot9weight = 19.30 --export:;Slot9 weight.
local dbhtml = ""
local dhtml = ""
local index = {7, 8, 9, 10, 11, 12, 13, 14, 15} -- Row of Container?
local containers = {slot1, slot2, slot3, slot4, slot5, slot6, slot7, slot8, slot9} -- slot names
local weights = {slot1weight, slot2weight, slot3weight, slot4weight, slot5weight, slot6weight, slot7weight, slot8weight, slot9weight} -- inspected kg of item
local items = {slot1item, slot2item, slot3item, slot4item, slot5item, slot6item, slot7item, slot8item, slot9item} -- names to display
local htmlContent = ""
local containermax = 9600 --export:;Your max container holding.
for i=1, #containers do
htmlContent = htmlContent .. "<tr>".."<th>"..index[i].."</th><th>"..items[i].."</th><th>"..math.ceil(((math.ceil((containers[i].getItemsMass()/weights[i]) - 0.5)/containermax)*100)).."%</th><th>"..math.ceil((containers[i].getItemsMass()/weights[i]) - 0.5).."</th><tr>"
end
local html = [[
<table style="
margin-left: auto;
margin-right: auto;
width:30%;
font-size:1.25em;
text-align:left;">
<tr style = "
background-color:Purple;
color:black !important;">
<svg>
<g>
<text xml:space="preserve" text-anchor="start" font-family="Helvetica, Arial, sans-serif" font-size="30" id="svg_8" y="50" x="10" stroke="#ff0000" fill="#ff7f00">PB2</text>
</g></svg>
<th>Row</th>
<th>Product</th>
<th>Container%</th>
<th>Total Ore</th>
</tr>
]]..htmlContent..[[
</table>]]
databank.setStringValue(OreMonitorTwo,html)
Programming Board 3
--databank is last slot to add and named databank
---Unit Start
unit.setTimer("Live",1)
unit.hide()
----Unit Tick ---Name the Tick Live
--databank is last slot to add and named databank
local slot1item = "Kobelckite" --export:;Slot1 Iten.
local slot1weight = 2.37 --export:;Slot1 weight.
local slot2item = "Columbite" --export:;Slot2 Iten.
local slot2weight = 5.38 --export:;Slot2 weight.
local slot3item = "Illmenite" --export:;Slot3 Iten.
local slot3weight = 4.55 --export:;Slot3 weight.
local slot4item = "Rhodonite" --export:;Slot4 Iten.
local slot4weight = 3.76 --export:;Slot4 weight.
local slot5item = "Vanadinite" --export:;Slot5 Iten.
local slot5weight = 6.95 --export:;Slot5 weight.
local slot6item = "Not set" --export:;Slot6 Iten.
local slot6weight = 0 --export:;Slot6 weight.
local slot7item = "Not set" --export:;Slot7 Iten.
local slot7weight = 0 --export:;Slot7 weight.
local slot8item = "Not set" --export:;Slot8 Iten.
local slot8weight = 0 --export:;Slot8 weight.
local slot9item = "Not set" --export:;Slot9 Iten.
local slot9weight = 0 --export:;Slot9 weight.
local index = {16, 17, 18, 19, 20} -- Row of Container?
local containers = {slot1, slot2, slot3, slot4, slot5, slot6, slot7, slot8, slot9} -- slot names
local weights = {slot1weight, slot2weight, slot3weight, slot4weight, slot5weight, slot6weight, slot7weight, slot8weight, slot9weight} -- inspected kg of item
local items = {slot1item, slot2item, slot3item, slot4item, slot5item, slot6item, slot7item, slot8item, slot9item} -- names to display
local htmlContent = ""
local containermax = 1200 --export:;Your max container holding.
for i=1, #containers do
htmlContent = htmlContent .. "<tr>".."<th>"..index[i].."</th><th>"..items[i].."</th><th>"..math.ceil(((math.ceil((containers[i].getItemsMass()/weights[i]) - 0.5)/containermax)*100)).."%</th><th>"..math.ceil((containers[i].getItemsMass()/weights[i]) - 0.5).."</th><tr>"
end
local html = [[
<table style="
margin-left: auto;
margin-right: auto;
width:30%;
font-size:1.25em;
text-align:left;">
<tr style = "
background-color:Purple;
color:black !important;">
<svg>
<g>
<text xml:space="preserve" text-anchor="start" font-family="Helvetica, Arial, sans-serif" font-size="30" id="svg_8" y="50" x="10" stroke="#ff0000" fill="#ff7f00">PB3</text>
</g></svg>
<th>Row</th>
<th>Product</th>
<th>Container%</th>
<th>Total Ore</th>
</tr>
]]..htmlContent..[[
</table>]]
databank.setStringValue(OreMonitorThree,html)
Re-doing the autoconfiguration on the cockpit/seat after placing the radar should do it. Still might have to manually link the seat/cockpit to the radar after that.
Over the years I've found that the only way to please everyone in a game with a complex crafting system and economy is to implement Google Sheets into the game client.
About
This is a short script that prints base max thrust of linked engines. It can serve as an example, and may also be used to detect which engines do not have a technician buff applied to them.
Set-up
Place a programming board.
Link up to 10 engines to the programming board.
In the Lua editor (right-click, "Advanced", "Edit Lua code") create a unit start() event handler with this code:
-- detect linked engines
local engines = {}
for key, value in pairs(unit) do
if type(value) == "table" and type(value.export) == "table" then -- `value` is an element and `key` is the slot name
if value.getThrust and value.getMaxThrust then -- `value` is an engine
engines[#engines + 1] = value
end
end
end
-- get engine names
local engineNames = {}
for _, engine in ipairs(engines) do
-- engine name is available in its widget data
-- for other elements `core.getElementNameById` would have to be used instead
local dataJson = engine.getData()
local data = json.decode(dataJson)
engineNames[engine] = data.name or "???"
end
-- sort engines by name
table.sort(engines, function (engine1, engine2)
return engineNames[engine1] < engineNames[engine2]
end)
-- print engines and their base max thrust
system.print("Linked engines: " .. #engines)
for _, engine in ipairs(engines) do
local name = engineNames[engine]
local maxThrustBase = engine.getMaxThrustBase()
system.print(string.format("%s: %.0f N", name, maxThrustBase))
end
unit.exit()
Click "Apply" in the Lua editor, exit build mode and activate the programming board. You should see base max thrust printed in the Lua chat tab.
Change log
2020-09-13. Posted the first version (tested in r0.21.5).
The total lack of professionalism:
The 24/7 round the clock help that people like NQ-Stargazer et al have been providing to players who have issues such as losing items during placement, crashing into the earth with a ship full of Large elements due to server crash / own player folly and fully repairing their ships, and teleporting people to places they need to go when they wind up at Sanc instead of their activated Resurrection location. Totally unprofessional.
Devs constantly trying to keep players informed of what they are doing and what they're trying to fix. Trying to fix issues right now instead of next patch cycle. Trying to give a cushion of how long servers will be down for maintenance/upgrade/bughunting so they don't grossly overshoot the deadline. Totally unprofessional.
I think the protections in place will protect you greatly. I am sure that if you are peaceful in nature and want to do only building and no combat there are options for you. However limiting pvp to arenas would also cut down on tons of people who like to do PVP or just play to do PVP. The STU and GTU mechanics talked about offer tons of building options in safe areas. Space stations are the only real thing that my organization discussed that almost wouldn't be worth building without having sentries on guard at all times. Since space is open pvp. I am interested in other people thoughts on this.