// native ArrayFindString(Array:which, const item[]); static cell AMX_NATIVE_CALL ArrayFindString(AMX* amx, cell* params) { CellArray* vec = HandleToVector(amx, params[1]); if (vec == NULL) { return -1; } cell *b, *a = get_amxaddr(amx, params[2]); size_t cellcount = vec->blocksize(); size_t a_len = ke::Max(1, amxstring_len(a)); size_t len = a_len > cellcount ? cellcount : a_len; for (size_t i = 0; i < vec->size(); i++) { b = vec->at(i); if (fastcellcmp(a, b, len)) { return static_cast<cell>(i); } } return -1; }
// native PushStackArray(Stack:handle, const any:values[], size= -1); static cell AMX_NATIVE_CALL PushStackArray(AMX* amx, cell* params) { CellArray* vec = HandleToVector(amx, params[1]); if (vec == NULL) { return 0; } cell *blk = vec->push(); if (!blk) { LogError(amx, AMX_ERR_NATIVE, "Failed to grow stack"); return 0; } cell *addr = get_amxaddr(amx, params[2]); size_t indexes = vec->blocksize(); if (params[3] != -1 && (size_t)params[3] <= vec->blocksize()) { indexes = params[3]; } memcpy(blk, addr, indexes * sizeof(cell)); return 1; }
static cell_t FindStringInArray(IPluginContext *pContext, const cell_t *params) { CellArray *array; HandleError err; HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent); if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) != HandleError_None) { return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err); } char *str; pContext->LocalToString(params[2], &str); for (unsigned int i = 0; i < array->size(); i++) { const char *array_str = (const char *)array->at(i); if (strcmp(str, array_str) == 0) { return (cell_t) i; } } return -1; }
// native bool:PopStackString(Stack:handle, buffer[], maxlength, &written = 0); static cell AMX_NATIVE_CALL PopStackString(AMX* amx, cell* params) { CellArray* vec = ArrayHandles.lookup(params[1]); if (!vec) { LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]); return 0; } if (vec->size() == 0) { return 0; } size_t idx = vec->size() - 1; cell *blk = vec->at(idx); int numWritten = set_amxstring_utf8(amx, params[2], blk, amxstring_len(blk), params[3]); *get_amxaddr(amx, params[4]) = numWritten; vec->remove(idx); return 1; }
static cell_t FindValueInArray(IPluginContext *pContext, const cell_t *params) { CellArray *array; HandleError err; HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent); if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) != HandleError_None) { return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err); } // the blocknumber is not guaranteed to always be passed size_t blocknumber = 0; if (params[0] >= 3) { blocknumber = (size_t) params[3]; } if (blocknumber >= array->blocksize()) { return pContext->ThrowNativeError("Invalid block %d (blocksize: %d)", blocknumber, array->blocksize()); } for (unsigned int i = 0; i < array->size(); i++) { cell_t *blk = array->at(i); if (params[2] == blk[blocknumber]) { return (cell_t) i; } } return -1; }
// native Array:ArrayClone(Array:which); static cell AMX_NATIVE_CALL ArrayClone(AMX* amx, cell* params) { CellArray* vec = HandleToVector(amx, params[1]); if (vec == NULL) { return 0; } CellArray *clonevec = vec->clone(); // Scan through the vector list to see if any are NULL. // NULL means the vector was previously destroyed. for (unsigned int i = 0; i < VectorHolder.length(); ++i) { if (VectorHolder[i] == NULL) { VectorHolder[i] = clonevec; return i + 1; } } VectorHolder.append(clonevec); return VectorHolder.length(); }
// native ArrayPushArray(Array:which, const any:input[], size = -1); static cell AMX_NATIVE_CALL ArrayPushArray(AMX* amx, cell* params) { CellArray* vec = ArrayHandles.lookup(params[1]); if (!vec) { LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]); return 0; } cell *blk = vec->push(); if (!blk) { LogError(amx, AMX_ERR_NATIVE, "Failed to grow array"); return 0; } cell *addr = get_amxaddr(amx, params[2]); size_t indexes = vec->blocksize(); if (*params / sizeof(cell) == 3) { if (params[3] != -1 && (size_t)params[3] <= vec->blocksize()) { indexes = params[3]; } } memcpy(blk, addr, sizeof(cell) * indexes); return static_cast<cell>((vec->size() - 1)); }
// native DoNotUse : ArrayGetStringHandle(Array : which, item); static cell AMX_NATIVE_CALL ArrayGetStringHandle(AMX* amx, cell* params) { CellArray* vec = ArrayHandles.lookup(params[1]); if (!vec) { LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]); return 0; } size_t idx = (size_t)params[2]; if (idx >= vec->size()) { LogError(amx, AMX_ERR_NATIVE, "Invalid index %d (count: %d)", idx, vec->size()); return 0; } cell* ptr = vec->at(idx); if (ptr == NULL) { return 0; } return reinterpret_cast<cell>(ptr); }
static cell_t PushArrayArray(IPluginContext *pContext, const cell_t *params) { CellArray *array; HandleError err; HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent); if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) != HandleError_None) { return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err); } cell_t *blk = array->push(); if (!blk) { return pContext->ThrowNativeError("Failed to grow array"); } cell_t *addr; pContext->LocalToPhysAddr(params[2], &addr); size_t indexes = array->blocksize(); if (params[3] != -1 && (size_t)params[3] <= array->blocksize()) { indexes = params[3]; } memcpy(blk, addr, sizeof(cell_t) * indexes); return (cell_t)(array->size() - 1); }
// native PushStackString(Stack:handle, const value[]); static cell AMX_NATIVE_CALL PushStackString(AMX* amx, cell* params) { CellArray* vec = ArrayHandles.lookup(params[1]); if (!vec) { LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]); return 0; } cell *blk = vec->push(); if (!blk) { LogError(amx, AMX_ERR_NATIVE, "Failed to grow stack"); return 0; } int len; const char *value = get_amxstring(amx, params[2], 0, len); strncopy(blk, value, vec->blocksize()); return 1; }
static cell_t PushArrayString(IPluginContext *pContext, const cell_t *params) { CellArray *array; HandleError err; HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent); if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) != HandleError_None) { return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err); } cell_t *blk = array->push(); if (!blk) { return pContext->ThrowNativeError("Failed to grow array"); } char *str; pContext->LocalToString(params[2], &str); smcore.strncopy((char *)blk, str, array->blocksize() * sizeof(cell_t)); return (cell_t)(array->size() - 1); }
static cell_t PopStackString(IPluginContext *pContext, const cell_t *params) { HandleError err; CellArray *array; size_t idx, numWritten; cell_t *blk, *pWritten; HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent); if ((err = g_HandleSys.ReadHandle(params[1], htCellStack, &sec, (void **)&array)) != HandleError_None) { return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err); } if (array->size() == 0) { return 0; } idx = array->size() - 1; blk = array->at(idx); pContext->StringToLocalUTF8(params[2], params[3], (char *)blk, &numWritten); pContext->LocalToPhysAddr(params[4], &pWritten); *pWritten = (cell_t)numWritten; array->remove(idx); return 1; }
void visualizePlot(int type, int axis) { ofstream f(( resdir + "/plot/" + Utils::doubleToString(ca->getTime()) + "_" + getName(type) + "_" + Utils::getAxisName(axis) + ".plot").c_str()); cout << ( resdir + "/plot/" + Utils::doubleToString(ca->getTime()) + "_" + getName(type) + "_" + Utils::getAxisName(axis) + ".plot") << endl; f << " set term gif" << endl; f << " set autoscale x" << endl; f << " set autoscale y" << endl; f << " set output \"" + resdir + "/"<<getName(type)<<"/"<<Utils::getAxisName(axis)<<"/"<<ca->getTime()<<"_"<<getName(type)<<"_" <<Utils::getAxisName(axis) <<".gif\"" << endl; f << " set title \"t=" << ca->getTime() << " [sec], "<<getName(type)<<" [" << getDimention(type) << "]\"" << endl; f << " set xlabel \""<<Utils::getAxisName(axis)<<" [Rz]\"" << endl; f << " plot "; for(int i=0; i<time_drops.size(); i++) { f << "'"<<(resdir + "/plot/" + Utils::doubleToString(time_drops[i]) + "_" + getName(type) + "_" + Utils::getAxisName(axis) + ".data")<<"' "<< "with linespoints pt " << i+1; if(i+1 != time_drops.size()) f << ", "; } f << endl; f.close(); }
static cell_t GetArrayString(IPluginContext *pContext, const cell_t *params) { CellArray *array; HandleError err; HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent); if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) != HandleError_None) { return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err); } size_t idx = (size_t)params[2]; if (idx >= array->size()) { return pContext->ThrowNativeError("Invalid index %d (count: %d)", idx, array->size()); } cell_t *blk = array->at(idx); size_t numWritten = 0; pContext->StringToLocalUTF8(params[3], params[4], (char *)blk, &numWritten); return numWritten; }
static cell_t SetArrayString(IPluginContext *pContext, const cell_t *params) { CellArray *array; HandleError err; HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent); if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) != HandleError_None) { return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err); } size_t idx = (size_t)params[2]; if (idx >= array->size()) { return pContext->ThrowNativeError("Invalid index %d (count: %d)", idx, array->size()); } cell_t *blk = array->at(idx); char *str; pContext->LocalToString(params[3], &str); return smcore.strncopy((char *)blk, str, array->blocksize() * sizeof(cell_t)); }
// native PushStackArray(Stack:handle, const any:values[], size= -1); static cell AMX_NATIVE_CALL PushStackArray(AMX* amx, cell* params) { CellArray* vec = ArrayHandles.lookup(params[1]); if (!vec) { LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]); return 0; } cell *blk = vec->push(); if (!blk) { LogError(amx, AMX_ERR_NATIVE, "Failed to grow stack"); return 0; } cell *addr = get_amxaddr(amx, params[2]); size_t indexes = vec->blocksize(); if (params[3] != -1 && (size_t)params[3] <= vec->blocksize()) { indexes = params[3]; } memcpy(blk, addr, indexes * sizeof(cell)); return 1; }
// native ArrayFindString(Array:which, const item[]); static cell AMX_NATIVE_CALL ArrayFindString(AMX* amx, cell* params) { CellArray* vec = ArrayHandles.lookup(params[1]); if (!vec) { LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]); return -1; } cell *b, *a = get_amxaddr(amx, params[2]); size_t cellcount = vec->blocksize(); size_t a_len = ke::Max(1, amxstring_len(a)); size_t len = a_len > cellcount ? cellcount : a_len; for (size_t i = 0; i < vec->size(); i++) { b = vec->at(i); if (fastcellcmp(a, b, len)) { return static_cast<cell>(i); } } return -1; }
// native ArraySetString(Array:which, item, const input[]); static cell AMX_NATIVE_CALL ArraySetString(AMX* amx, cell* params) { CellArray* vec = ArrayHandles.lookup(params[1]); if (!vec) { LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]); return 0; } size_t idx = (size_t)params[2]; if (idx >= vec->size()) { LogError(amx, AMX_ERR_NATIVE, "Invalid index %d (count: %d)", idx, vec->size()); return 0; } cell *blk = vec->at(idx); int len; char *str = get_amxstring(amx, params[3], 0, len); return strncopy(blk, str, ke::Min((size_t)len + 1, vec->blocksize())); }
bool ProcessCommandTarget(cmd_target_info_t *info) { List<SimpleMultiTargetFilter *>::iterator iter; for (iter = simpleMultis.begin(); iter != simpleMultis.end(); iter++) { SimpleMultiTargetFilter *smtf = (*iter); if (strcmp(smtf->pattern.c_str(), info->pattern) == 0) { CellArray *array = new CellArray(1); HandleSecurity sec(g_pCoreIdent, g_pCoreIdent); Handle_t hndl = handlesys->CreateHandleEx(htCellArray, array, &sec, NULL, NULL); AutoHandleCloner ahc(hndl, sec); if (ahc.getClone() == BAD_HANDLE) { smcore.LogError("[SM] Could not allocate a handle (%s, %d)", __FILE__, __LINE__); delete array; return false; } smtf->fun->PushString(info->pattern); smtf->fun->PushCell(ahc.getClone()); cell_t result = 0; if (smtf->fun->Execute(&result) != SP_ERROR_NONE || !result) return false; IGamePlayer *pAdmin = info->admin ? playerhelpers->GetGamePlayer(info->admin) : NULL; info->num_targets = 0; for (size_t i = 0; i < array->size(); i++) { cell_t client = *array->at(i); IGamePlayer *pClient = playerhelpers->GetGamePlayer(client); if (pClient == NULL || !pClient->IsConnected()) continue; if (playerhelpers->FilterCommandTarget(pAdmin, pClient, info->flags) == COMMAND_TARGET_VALID) { info->targets[info->num_targets++] = client; if (info->num_targets >= unsigned(info->max_targets)) break; } } info->reason = info->num_targets > 0 ? COMMAND_TARGET_VALID : COMMAND_TARGET_EMPTY_FILTER; if (info->num_targets) { smcore.strncopy(info->target_name, smtf->phrase.c_str(), info->target_name_maxlength); info->target_name_style = smtf->phraseIsML ? COMMAND_TARGETNAME_ML : COMMAND_TARGETNAME_RAW; } return true; } } return false; }
public: void calculateFieldE(){ CellArray ca = *Calculater::ca; for(int axis=0; axis<3; axis++){ for(int i=0;i<ca.getSize();i++){ Cell cell = *ca.getCell(i); if(cell.getRib(axis, Cell::dr)->getMark() == Rib::INTERNAL_RIB_MARK) calculateFieldE(cell.getRib(axis, Cell::dr)); } } }
public: void calculateFieldB(){ CellArray ca = *Calculater::ca; for(int axis=0; axis<3; axis++){ for(int i=0;i<ca.getSize();i++){ Cell cell = *ca.getCell(i); if(cell.getSide(axis, Cell::BACKWARD_SIDE)->getMark() == Side::INTERNAL_SIDE_MARK) calculateFieldB(cell.getSide(axis, Cell::BACKWARD_SIDE)); } } }
// native bool:IsStackEmpty(Stack:handle); static cell AMX_NATIVE_CALL IsStackEmpty(AMX* amx, cell* params) { CellArray* vec = HandleToVector(amx, params[1]); if (vec == NULL) { return 0; } return vec->size() == 0; }
// native Array:ArrayClone(Array:which); static cell AMX_NATIVE_CALL ArrayClone(AMX* amx, cell* params) { CellArray* vec = ArrayHandles.lookup(params[1]); if (!vec) { LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]); return 0; } return ArrayHandles.clone(vec->clone()); }
// native bool:IsStackEmpty(Stack:handle); static cell AMX_NATIVE_CALL IsStackEmpty(AMX* amx, cell* params) { CellArray* vec = ArrayHandles.lookup(params[1]); if (!vec) { LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]); return 0; } return vec->size() == 0; }
// native ArrayClear(Array:which); static cell AMX_NATIVE_CALL ArrayClear(AMX* amx, cell* params) { CellArray* vec = HandleToVector(amx, params[1]); if (vec == NULL) { return 0; } vec->clear(); return 1; }
public: void calculateFlows(){ cout << "test" << endl; CellArray ca = *Calculater::ca; for(int axis=0; axis<3; axis++){ for(int i=0;i<ca.getSize();i++){ Cell lc = *ca.getCell(i); if(lc.getCell(axis, Cell::FORWARD_SIDE) == NULL) continue; Cell rc = *lc.getCell(axis, Cell::FORWARD_SIDE); lc.getSide(axis, Cell::FORWARD_SIDE)->setFlow(calculateFlow(axis, lc, rc)); } } }
static cell_t GetArraySize(IPluginContext *pContext, const cell_t *params) { CellArray *array; HandleError err; HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent); if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) != HandleError_None) { return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err); } return (cell_t)array->size(); }
static cell_t ClearArray(IPluginContext *pContext, const cell_t *params) { CellArray *array; HandleError err; HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent); if ((err = g_HandleSys.ReadHandle(params[1], htCellArray, &sec, (void **)&array)) != HandleError_None) { return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err); } array->clear(); return 1; }
void imPad(CellArray& input, CellArray& output, std::vector<int> &pad, const std::string &type, double val) { int ns[3] = {input.rows, input.cols, input.channels}, ms[3]; // extract padding amounts int pt, pb, pl, pr; if (pad.size() == 1) pt = pb = pl = pr = pad[0]; else if (pad.size() == 2) pt = pb = pad[0], pl = pr = pad[1]; else if (pad.size() == 4) pt = pad[0], pb = pad[1], pl = pad[2], pr = pad[3]; else wrError("Input pad must have 1, 2, or 4 values."); // figure out padding type (flag and val) int flag = 0; if (type == "") flag = 0; else if (type == "replicate") flag = 1; else if (type == "symmetric") flag = 2; else if (type == "circular") flag = 3; else wrError("Invalid pad value"); if (ns[0] == 0 || ns[1] == 0) flag = 0; // create output array ms[0] = ns[0] + pt + pb; ms[1] = ns[1] + pl + pr; ms[2] = ns[2]; if (ms[0] < 0 || ns[0] <= -pt || ns[0] <= -pb ) ms[0] = 0; if (ms[1] < 0 || ns[1] <= -pl || ns[1] <= -pr ) ms[1] = 0; output.create(ms[0], ms[1], ms[2]); // pad array float *A = input.data, *B = output.data; imPad(A, B, ns[0], ns[1], ns[2], pt, pb, pl, pr, flag, float(val)); }
// native bool:PopStackCell(Stack:handle, &any:value, block = 0, bool:asChar = false); static cell AMX_NATIVE_CALL PopStackCell(AMX* amx, cell* params) { CellArray* vec = ArrayHandles.lookup(params[1]); if (!vec) { LogError(amx, AMX_ERR_NATIVE, "Invalid array handle provided (%d)", params[1]); return 0; } if (vec->size() == 0) { return 0; } cell *buffer = get_amxaddr(amx, params[2]); size_t index = params[3]; cell *blk = vec->at(vec->size() - 1); size_t idx = (size_t)params[3]; if (params[4] == 0) { if (idx >= vec->blocksize()) { LogError(amx, AMX_ERR_NATIVE, "Invalid block %d (blocksize: %d)", idx, vec->blocksize()); return 0; } *buffer = blk[idx]; } else { if (idx >= vec->blocksize() * 4) { LogError(amx, AMX_ERR_NATIVE, "Invalid byte %d (blocksize: %d bytes)", idx, vec->blocksize() * 4); return 0; } *buffer = (cell)*((char *)blk + idx); } vec->remove(vec->size() - 1); return 1; }